我正在尝试理解Objective-C属性,并且我对它们的语法有一些挥之不去的问题。
明确为这样的属性声明一个ivar有什么区别:
@interface myObject1 : NSObject {
NSString *title;
}
@property (copy) NSString *title;
@end
和这个:
@interface myObject2 : NSObject {
}
@property (copy) NSString *title;
@end
myObject2示例似乎有效。可以像在myObject2中那样实现属性,还是应该始终明确定义关联的ivar?
没有明确宣布伊娃的影响是什么?
在现代Objective C运行时(nonfragile-abi)它们是相同的,ivar支持将由@synthesize声明自动创建。这是iPhone和64位Mac OS X应用程序使用的运行时。 32位Mac OS X使用遗留运行时,无法合成ivar,并且您编写的第二位代码无法正确编译。
最新版本的iPhone模拟器使用现代运行时,但较旧的版本不使用。因此,虽然两个代码示例都适用于实际的iPhone(合成必要的存储),但第二个示例将无法为模拟器编译,除非您拥有最新的Xcode。
使用现代运行时它们是相同的(如前所述),除了当您查看变量或将鼠标悬停在变量上时,未在MyObject1中明确定义的ivars不会显示在调试器中,您必须打印输出变量值或在变量视图中设置变量的摘要以显示属性。
我开始使用MyObject2做事的方式,因为键入较少但是更烦人的是必须输入gdb命令行来查看调试器中的变量状态:(