【问题标题】:Objective C : @property declaration and instance variable declarationObjective C:@property 声明和实例变量声明
【发布时间】:2012-03-10 14:17:35
【问题描述】:

虽然这个问题很基础,但我发现理解 IOS 编程非常重要。有时我们过去只声明实例变量,而没有为其设置任何关联属性。有些我们只是声明属性并使用 synthesize 来获取或设置值。有时我觉得有必要在代码中声明两者,当编译给我警告时!在 Objective C 中操作属性的基本原理是什么。我知道为任何实例变量创建 getter 和 setter 的基本要求,但是什么时候? 我见过很多次我们根本不使用属性,之后我们也很容易设置和获取变量的值。此外,不同类型的属性,如原子、非原子、强、保留对我来说非常不清楚。 XCODE 升级到 4.2 动摇了我对内存管理的概念。有人可以清除我脑海中的乌云吗?

【问题讨论】:

标签: objective-c ios5 automatic-ref-counting


【解决方案1】:

属性始终是直接访问 ivar 的首选方式,主要有以下原因:

  • 您可以在子类中覆盖 getter 或 setter
  • 您可以定义“分配行为”(即copyassignretain/strongweak
  • 您可以同步 ivar 访问

关键词:

  • copy: 设置时对象被复制到ivar
  • assign: 对象的指针在设置时分配给 ivar
  • retain/strong: 对象保留在片场
  • weak:在 ARC 中,这类似于分配,但会在实例被释放时自动设置为 nil,也用于垃圾回收环境。
  • nonatomic:访问器不是@synchronized(线程安全),因此更快
  • atomic:访问器是 @synchronized(线程安全),因此速度较慢

通常你应该总是合成一个 ivar。如果您出于性能原因需要更快的访问速度,您也可以随时直接访问合成的 ivar。

【讨论】:

  • 所有关键字的小定义真的很有帮助...谢谢..:)
  • 如果这对您有帮助,您应该点击 Erik 答案旁边的复选标记(打勾)来奖励他
【解决方案2】:

在打字时,我看到“Erik Aigner”速度更快,而且答案很好。

有关属性、合成和自定义设置器的示例,请参阅我在堆栈上的答案: Objective-C convention to prevent "local declaration hides instance variable" warning

有关 ARC 的陈述教程,请参阅 Ray wenderlich 他的网站上的说明:

Beginning ARC in iOS 5 part 1

Beginning ARC in iOS 5 part 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多