为什么我必须在Header文件中定义两次变量?

Ber*_*d B 3 cocoa-touch objective-c ios

为什么我必须在头文件中定义两次变量?这些变量之间有什么不同?

第一个定义是:

@interface MyController: UIViewController
{
    NSInteger selectedIndex;
}
Run Code Online (Sandbox Code Playgroud)

第二个定义是:

@property (nonatomic) NSInteger selectedIndex;
Run Code Online (Sandbox Code Playgroud)

Jam*_*ter 6

您在Objective-C的早期版本中需要看到的内容,但现在不再需要了.

在NeXT使用的Objective-C的第一个版本中,直到引入新的运行时(在Mac OS X上使用Objective-C 2.0),所有实例变量都必须在其中声明为类的结构的一部分@interface.原因是如果你继承了一个类,编译器需要知道类的实例变量布局,以便它可以看到放置子类的实例变量的偏移量.

引入属性时,合成属性必须由类结构中的实例变量"支持".因此,您必须声明实例变量和属性.

所有这些都不再适用.较新的Objective-C在查找实例变量偏移的方式上不那么脆弱,这意味着一些变化:

  • 并非所有实例变量都需要在@interface.它们现在可以在以下内容中定义@implementation:虽然不是因为可能发生冲突和其他问题而在类别中.
  • 可以基于属性定义推断和创建合成属性的实例变量.
  • 您可以以编程方式将实例变量添加到您在运行时创建的类中(仅在您将类注册为系统可用之前).

因此,重申一下,您只需要在旧版本的Objective-C语言中声明实例变量和合成属性.你所看到的是多余的,不应被视为"最佳实践".

[资源]