当您没有在目标C中列出任何内容时,适当的默认属性是什么?
例如,如果我写了这个:
@property float value;
默认值是什么,比如只读,是否保留......等等。
答案 0 :(得分:64)
默认/隐含值为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]其所有权隐含强大。在此次修订之前,合成这样的财产是不合理的。
答案 1 :(得分:7)
等于
@property (atomic, readwrite, assign) float value;
答案 2 :(得分:1)
Objective-C 属性属性
在Objective-C中,当你写@property
时,在你写了一个属性列表之后
指针的默认属性 atomic, readwrite
和 strong
或原始属性的 assign
@property (atomic, readwrite, strong) NSString *someString;
@property (atomic, readwrite, assign) int someInt;
原子性只是线程安全的一部分 - Atomic Operations
[About]
atomic
(默认)——保证你不会得到一些垃圾内存,它总是包含一些值。
nonatomic
- 您可以在多线程环境中获取垃圾数据,但由于缺乏附加逻辑,速度会快一些
访问 - 修改访问
readwrite
(默认)- 生成 getter 和 setter 并可以使用它们
readonly
- 只生成 getter。您无法设置某些值
存储 - 自动生成的支持实例变量 (iVar) 的内存管理
strong
(指针的默认值)- 强支持的 iVar 引用对象时无法释放对象
retain
历史上是在 strong
之前以相同的想法创建的。不同之处在于 retain
被禁用时应该使用 ARC
assign
(原始值的默认值) - 超出引用计数
weak
- 此引用没有像 strong
那样被考虑 (+1)。这就是为什么当所有其他 strong
引用离开我们的对象时,我们的引用将指向 nil
。它用于与 Retain cycle
对抗,委托模式就是一个很好的例子[About]
unsafe_unretained
- 类似于 weak
但当没有人引用对象时,我们的 iVar 将指向一些垃圾(dangling pointer
)并且不会出现预期行为。它的性能可能比 weak
copy
- 当您将某个对象传递给我们属性的 setter 时,会将对象的新副本分配给 iVar (NSCopying
)