在 @implementation 中声明变量

7

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

@implementation ViewController
{
    NSString *name;
}

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

8
@implementation部分声明ivars的优点是更好的封装性。这样,ivars就不必出现在.h文件中,因此对于只能看到头文件的类的外部用户来说,它们是不可见的。这更好地隐藏了类的内部实现。
一般来说,现在属性可以自动合成ivars,其他ivars也可以直接在@implementation块中声明,我认为你根本没有理由在@interface中声明一个ivars(除了向后兼容)。

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

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

如果我将NSString声明为超出范围,它会变成全局变量吗?我的意思是任何外部类都可以访问该变量吗? - Arildo Junior
4
有点;请参见一些人认为是重复问题的问题,因为它涵盖了实例变量和全局/静态变量之间的区别。请注意,在@implementation中声明实例变量是相对较新的做法——在32位Mac OS X运行时期间,由于编译器生成类的方式,这是不可能的。一旦“脆弱的基类”问题得到解决,就可以进行自动合成和/或在主要@interface之外声明实例变量。 - bbum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接