目标C:@property声明和实例变量声明

时间:2012-02-20 07:51:57

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

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

2 个答案:

答案 0 :(得分:9)

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

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

关键词:

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

一般来说,你应该总是合成一个伊娃。如果出于性能原因需要更快的访问权限,您也可以直接访问合成的ivar。

答案 1 :(得分:2)

在打字的时候,我看到“Erik Aigner”的答案更快了。

关于属性的een示例,合成和自定义setter在堆栈上看到我的答案: 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