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)
您在Objective-C的早期版本中需要看到的内容,但现在不再需要了.
在NeXT使用的Objective-C的第一个版本中,直到引入新的运行时(在Mac OS X上使用Objective-C 2.0),所有实例变量都必须在其中声明为类的结构的一部分
@interface.原因是如果你继承了一个类,编译器需要知道类的实例变量布局,以便它可以看到放置子类的实例变量的偏移量.引入属性时,合成属性必须由类结构中的实例变量"支持".因此,您必须声明实例变量和属性.
所有这些都不再适用.较新的Objective-C在查找实例变量偏移的方式上不那么脆弱,这意味着一些变化:
- 并非所有实例变量都需要在
@interface.它们现在可以在以下内容中定义@implementation:虽然不是因为可能发生冲突和其他问题而在类别中.- 可以基于属性定义推断和创建合成属性的实例变量.
- 您可以以编程方式将实例变量添加到您在运行时创建的类中(仅在您将类注册为系统可用之前).
因此,重申一下,您只需要在旧版本的Objective-C语言中声明实例变量和合成属性.你所看到的是多余的,不应被视为"最佳实践".