在@implementation中声明变量

Ari*_*ior 7 scope class objective-c variable-declaration

我在一本书中看到了一个显示此代码的示例:

@implementation ViewController
{
    NSString *name;
}
Run Code Online (Sandbox Code Playgroud)

为什么不宣布这个@interface?在声明变量@implementation而不是@interface?中有什么区别?为什么NSString在范围内声明这个?

Ole*_*ann 8

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

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

为什么在范围内声明这个NSString?

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

  • 有点; 看到一些人认为是欺骗的问题,因为它涵盖了ivars和globals/statics之间的区别.请注意,`@ implementation`中的ivar声明相对较新 - 由于编译器生成类的方式,在32位Mac OS X运行时中无法实现.一旦"脆弱的基类"问题得到解决,就可以在主`@interface`之外进行自动合成和/或声明ivars. (4认同)