问题 财产声明和自动备份存储分配


我正在尝试理解Objective-C属性,并且我对它们的语法有一些挥之不去的问题。

明确为这样的属性声明一个ivar有什么区别:

@interface myObject1 : NSObject {
  NSString *title;
}
@property (copy) NSString *title;
@end

和这个:

@interface myObject2 : NSObject {
}
@property (copy) NSString *title;
@end

myObject2示例似乎有效。可以像在myObject2中那样实现属性,还是应该始终明确定义关联的ivar?

没有明确宣布伊娃的影响是什么?


11899
2017-07-13 14:11


起源

很抱歉由于主要做32位OSX,我似乎经常忘记Louis发布的内容。 - Georg Fritzsche


答案:


在现代Objective C运行时(nonfragile-abi)它们是相同的,ivar支持将由@synthesize声明自动创建。这是iPhone和64位Mac OS X应用程序使用的运行时。 32位Mac OS X使用遗留运行时,无法合成ivar,并且您编写的第二位代码无法正确编译。

最新版本的iPhone模拟器使用现代运行时,但较旧的版本不使用。因此,虽然两个代码示例都适用于实际的iPhone(合成必要的存储),但第二个示例将无法为模拟器编译,除非您拥有最新的Xcode。


13
2017-07-13 14:39



那么有没有明确声明支持变量的缺点(除了你提到的旧编译器/模拟器的不兼容问题)? - Avalanchis
对于当前的编译器,不,没有缺点。如果你在Clang的开发版本中使用并打开自动合成器(-nonfragile-abi2),事情会稍微复杂一点,但我不担心那种东西。 - Louis Gerbarg
非常感谢。我认为我的困惑主要是因为我没有意识到这是一个相对较新的语言特性,因此不清楚为什么你想要明确声明ivar为一个简单的属性,如果你没有。 - Avalanchis


使用现代运行时它们是相同的(如前所述),除了当您查看变量或将鼠标悬停在变量上时,未在MyObject1中明确定义的ivars不会显示在调试器中,您必须打印输出变量值或在变量视图中设置变量的摘要以显示属性。

我开始使用MyObject2做事的方式,因为键入较少但是更烦人的是必须输入gdb命令行来查看调试器中的变量状态:(


2
2017-07-18 04:48