当您未在目标 C 中列出任何属性时,属性的默认属性是什么?
例如,如果我写了这个:
@property float value;
默认值是什么,比如它是只读的,它是否保留......等等?
默认/隐式值为
atomic
、readwrite
和 assign
。
原子
这意味着该值是原子读/写的。与有些流行的误解相反,原子性并不等于线程安全。简单来说,它保证您读取或写入的值将被完整读取或写入(当使用访问器时)。即使您一直使用访问器,它也不是严格线程安全的。
读写该属性有一个 setter 和一个 getter。
分配此默认值通常用于 POD(普通旧数据)和内置类型(例如
int
)。
对于
NSObject
类型,您会倾向于持有强有力的参考。在大多数情况下,您将声明属性
copy
、strong
或 retain
。 assign
不执行引用计数操作。另请参阅:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#property-declarations强
在某些情况下,该属性可能在 ARC 下隐式
strong
:
在没有所有权来源的情况下合成的可保留对象指针类型的属性具有其关联实例变量的所有权(如果它已经存在);否则,[从 Apple 3.1、LLVM 3.1 开始]其所有权是隐含的强的。在此修订之前,综合这样的属性是不正确的。
@property (atomic, readwrite, assign) float value;
[Objective-C 属性]
@property
时,在你编写属性列表之后
默认属性:
strong
、
atomic, readwrite
assign
、
atomic, readwrite
@property (atomic, readwrite, strong) NSString *someString;
@property (atomic, readwrite, assign) int someInt;
只是线程安全的一部分 - Atomic Operations
atomic
(默认)-保证你不会得到一些垃圾内存,它总是会包含一些值。
nonatomic
- 你可以在多线程环境中获取垃圾数据,但由于缺乏额外的逻辑,速度会快一点
- 修改访问权限
readwrite
(默认)- getter 和 setter 已生成并且可以使用
readonly
- 仅生成吸气剂。您无法设置某些值
- backed instance variables
(支持 iVar)
strong
(指针的默认值) - 当强支持的 iVar 有对其的引用时,对象无法被释放
retain
历史上是在
strong
之前创建的,具有相同的想法。不同之处在于,当 retain
被禁用时,应使用 ARC
assign
(基元的默认值)- 超出引用计数
weak
- 此参考不会像
strong
那样考虑(+1)。这就是为什么当所有其他 strong
引用离开我们的对象时,我们的引用将指向 nil
。它用于与Retain cycle
战斗,委托模式就是一个很好的例子[关于]
unsafe_unretained
- 与
weak
类似,但是当没有人引用对象时,我们的 iVar 将指向一些垃圾(dangling pointer
)并且行为不是预期的。它可以有比weak
更好一点的性能
copy
- 当您将某个对象传递给我们属性的 setter 时,对象的新副本会分配给 iVar(
NSCopying
协议)