在@implementation 中声明变量

Posted

技术标签:

【中文标题】在@implementation 中声明变量【英文标题】:Declaring Variables in @implementation 【发布时间】:2011-12-18 07:41:38 【问题描述】:

我在一本书中看到了一个例子,显示了这段代码:

@implementation ViewController

    NSString *name;

为什么不在@interface 中声明呢?在 @implementation 而不是 @interface 中声明变量有什么区别?为什么要在作用域中声明这个NSString

【问题讨论】:

【参考方案1】:

@implementation 部分声明ivars 的好处是更好的封装。这样,ivars 不必出现在.h 文件中,因此对于只能查看头文件的类的外部用户来说是不可见的。这更好地隐藏了类的内部实现。

一般来说,现在属性可以具有自动合成的 ivars,并且其他 ivars 可以直接在 @implementation 块中声明,我认为你没有理由在你的 @interface 中声明一个 ivars(除了向后兼容性)。

为什么要在作用域中声明这个 NSString?

因为这是声明实例变量的唯一方法。否则,您将声明一个可以从同一文件中的任何位置访问的变量(请参阅他的评论中链接到的问题 BoltClock)。

【讨论】:

那么如果我声明 NSString 超出范围,它会成为全局变量吗?我的意思是任何外部类都可以访问该变量? 排序;看到一些想法是骗局的问题,因为它涵盖了 ivars 和全局/静态之间的区别。请注意,@implementation 中的 ivar 声明相对较新——由于编译器生成类的方式,它在 32 位 Mac OS X 运行时中是不可能的。一旦“脆弱的基类”问题得到解决,就可以在主 @interface 之外进行自动综合和/或声明 ivars。

以上是关于在@implementation 中声明变量的主要内容,如果未能解决你的问题,请参考以下文章

iOS s私有变量 私有方法

在 C 语言中。如何获取先前声明的变量的左值标识符?

如何/在哪里声明用于编写objective-c代码的接口、实现、程序格式中的实例变量?

IMP指针和ObjcSendMsg

Extension

PHP的抽象类接口的区别和选择