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