Objective-C属性的类型

时间:2012-09-12 04:11:36

标签: objective-c xcode

在Objective-C中声明属性时,可配置的自定义选项有哪些,它们定义了访问器方法的行为方式?

例如,你可以拥有弱,强,只读。

1 个答案:

答案 0 :(得分:41)

这是简短的回答:

原子与非原子主要确保从合成的getter返回完整的值,并且完整的值由合成的setter写入。

readwrite vs readonly 确定合成属性是否具有合成访问者(readwrite具有setter并且是默认值,readonly不具有)。

assign vs weak vs retain vs copy 确定合成访问者如何与Objective-C内存管理方案交互。

现在答案很长:

Atomic v Nonatomic

假设你是@synthesizing方法实现,原子与非原子会改变生成的代码。如果您正在编写自己的setter / getter,则atomic / nonatomic / retain / assign / copy仅仅是建议性的。

使用原子,合成的setter / getter将确保始终从getter返回整个值或由setter设置,而不管任何其他线程上的setter活动。也就是说,如果线程A位于getter的中间,而线程B调用setter,则实际可行的值 - 很可能是自动释放的对象 - 将返回给A中的调用者。

在非原子能方面,没有这样的保证。因此,非原子比原子快得多。

什么原子不做是对线程安全做出任何保证。如果线程A与线程B同时调用getter并且C调用具有不同值的setter,则线程A可以获得返回的三个值中的任何一个 - 在调用任何setter之前的值或者传递给setter的任一值在B和C中。同样,对象最终可能会得到B或C中的值,无法分辨。

确保数据完整性 - 多线程编程的主要挑战之一 - 是通过其他方式实现的。

分配,弱,保留,复制

简而言之,assign vs weak vs retain vs copy确定了合成访问者如何与Objective-C内存管理方案交互:

  • assign是默认值,只是执行变量赋值。它不会声明所有权,因此如果没有其他人通过保留或其他方式自行声明所有权,则属性指针指向的对象可能随时消失。在ARC环境中,assign不能确保指针不会悬挂,这意味着如果另一侧的对象已被解除分配,指针可能最终指向垃圾。
  • weak与assign相同,只是它会将指针归零,导致释放的对象阻止它们悬空。弱功能仅适用于ARC环境。
  • retain指定应在发送时发送新值-retain并发送旧值。保留也被认为是强大的。
  • copy指定新值应该在分配时发送-copy并且旧值发送释放。复制通常用于属性,其中属性的类型具有可变表兄(NSArray / NSMutableArray),以防止其他人发送可变版本并更改它们/在背后更改它们等等。

请记住,对创建的对象执行retain / strong(它会增加引用计数),而copy会创建一个新对象。不过,区别在于您是要为对象添加另一个保留还是创建一个全新的对象。