如果在Objective-C中不列出任何属性,一个属性的默认属性是什么?
例如,如果我写了这个:
@property float value;
默认情况下会是什么样子,例如它是否是只读的,是否保留等等?
如果在Objective-C中不列出任何属性,一个属性的默认属性是什么?
例如,如果我写了这个:
@property float value;
默认情况下会是什么样子,例如它是否是只读的,是否保留等等?
默认/隐式值是atomic
,readwrite
和assign
。
atomic
这意味着值是原子性读取/写入的。与某些常见误解相反,原子性不等同于线程安全。简单来说,它保证了您读取或写入的值将在访问器被使用时完整地读取或写入。即使您一直使用访问器,它也不是严格的线程安全。
readwrite
属性被赋予了一个setter和一个getter。
assign
这个默认值通常用于POD(Plain-Old-Data)和内置类型(例如int
)。
对于NSObject
类型,您会倾向于持有一个强引用。在大多数情况下,您将声明该属性为copy
,strong
或retain
。 assign
不执行任何引用计数操作。另请参见:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#property-declarations
strong
在某些情况下,该属性可能会在ARC下被隐式为strong
:
可保留对象指针类型的属性,如果它没有所有权来源,则绑定到其关联的实例变量的所有权(如果实例变量已经存在); 否则,[从Apple 3.1开始,LLVM 3.1] 其拥有权是隐式的强引用。在此修订之前,合成此类属性无效。
它等同于
@property (atomic, readwrite, assign) float value;
Objective-C 属性属性
在 Objective-C 中,当您编写 @property
时,在编写属性列表后
默认属性:
pointer: strong
, atomic, readwrite
primitive: assign
, atomic, readwrite
@property (atomic, readwrite, strong) NSString *someString;
@property (atomic, readwrite, assign) int someInt;
原子性只是线程安全的一部分 - 原子操作
[关于]
atomic
(默认)- 它保证您不会得到一些垃圾内存,它总是包含某个值。
nonatomic
- 在多线程环境中,您可以获得垃圾数据,但由于缺少附加逻辑,速度略快
访问 - 修改访问
readwrite
(默认)- getter和setter被生成并且可以使用
readonly
- 只有getter被生成。 您无法设置某些值
存储 - 用于backed instance variables
(backing iVar)[关于]的内存管理,这些变量会自动生成
strong
(指针的默认值)- 当强支持的iVar引用它时,对象不能被释放
retain
是在strong
创建之前历史悠久的,具有相同的想法。 差异在于,retain
应在禁用ARC
时使用
assign
(原语的默认值)- 超出引用计数
weak
- 此引用不会被视为strong
所做的+1。 这就是为什么当所有其他strong
引用都超出我们对象时,我们的引用将指向nil
。 它用于解决保留周期
问题,委托模式是一个很好的例子[关于]
unsafe_unretained
- 类似于weak
,但是当没有任何引用指向对象时,我们的iVar将指向一些垃圾(dangling pointer
),行为不被期望。 它可以比weak
具有稍微更好的性能
copy
- 当您将某个对象传递到我们属性的setter中时,将分配一个新的对象副本给iVar(NSCopying
协议)