自动引用计数(ARC)引入了一些新的类型限定符。我见过__strong
和__weak
,但他们做了什么?
答案 0 :(得分:32)
__strong
意味着在赋值时,表达式的rvalue将被保留并使用原始语义存储到左值中。 (要解除分配这样的对象,你必须做的就是分配它nil
,先前引用的对象将被释放,nil
将被保留,这实际上什么都不做,它是桃子和奶油。)
__unsafe_unretained
和__weak
在rvalue的地址将分配给左值的意义上是相似的,但如果使用__weak
限定符,则此操作可保证为原子并受制于一些不同的语义。其中之一是,如果正在分配的对象当前正在进行释放,那么赋值将计算为nil
,然后将原子地存储回表达式的左值。因此,措辞__unsafe_unretained
,因为该操作确实不安全且没有保留。
__autoreleasing
与__strong
类似,只是有一点需要注意:保留的对象被推送到当前的自动释放池中,因此您可以获取对象的临时所有权以将其从集合中删除然后将其返回给调用者。还有其他用途,但它们主要与获取对象的临时所有权有关。
这些行为也会出现在相应的属性修饰符中(strong
,unsafe_unretained
和weak
)。
请参阅Clang Automatic Reference Counting Technical Specification
编辑:对于那些没有针对iOS 5的用户,因此无法获得__weak
,Mike Ash wrote a superb article(和实施)的好处,可以将弱引用置为零
答案 1 :(得分:4)
Strong告诉ARC保留该财产。
@property (strong,nonatomic) NSObject *object;
@property (retain,nonatomic) NSObject *object;
弱者本质上是指派,一种无法获得的财产。除了取消分配对象时,弱指针自动设置为nil。
@property (weak,nonatomic) NSObject *object;
@property (assign,nonatomic) NSObject *object;
弱势仅适用于iOS 4.3及更高版本。如果你想要定位iOS 4.2,你需要使用unsafe_unretained,它将完全像我们曾经使用的那样工作。
答案 2 :(得分:1)
类型限定符为__autoreleasing
,__strong
,__unsafe_unretained
和__weak
。属性修饰符为strong
,unsafe_unretained
和weak
。
在LLVM / Clang文档中查看section 4 of Automatic Reference Counting。