【问题标题】:Property Declaration and Automatic Backing Storage Allocation属性声明和自动后备存储分配
【发布时间】:2010-07-13 14:11:56
【问题描述】:

我正在尝试理解 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 的后果是什么?

【问题讨论】:

  • 抱歉造成混乱,由于我主要使用 32 位 OSX,我似乎经常忘记 Louis 发布的内容。

标签: iphone objective-c


【解决方案1】:

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

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

【讨论】:

  • 那么不明确声明支持变量有什么缺点(除了你提到的与旧编译器/模拟器的不兼容问题)?
  • 使用当前的编译器,不,没有缺点。如果您在 Clang 的开发版本中使用并打开自动合成器 (-nonfragile-abi2),事情会稍微复杂一些,但我不会担心这类事情。
  • 非常感谢。我认为我的困惑主要是因为我没有意识到这是一个相对较新的语言特性,所以不清楚为什么你要显式声明一个简单属性的 ivar,如果你不需要。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2021-02-20
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2014-10-22
    相关资源
    最近更新 更多