ARC推出的新型限定符有哪些?

时间:2011-10-31 02:29:34

标签: objective-c ios memory-management automatic-ref-counting

自动引用计数(ARC)引入了一些新的类型限定符。我见过__strong__weak,但他们做了什么?

3 个答案:

答案 0 :(得分:32)

__strong意味着在赋值时,表达式的rvalue将被保留并使用原始语义存储到左值中。 (要解除分配这样的对象,你必须做的就是分配它nil,先前引用的对象将被释放,nil将被保留,这实际上什么都不做,它是桃子和奶油。)

__unsafe_unretained__weak在rvalue的地址将分配给左值的意义上是相似的,但如果使用__weak限定符,则此操作可保证为原子并受制于一些不同的语义。其中之一是,如果正在分配的对象当前正在进行释放,那么赋值将计算为nil,然后将原子地存储回表达式的左值。因此,措辞__unsafe_unretained,因为该操作确实不安全且没有保留。

__autoreleasing__strong类似,只是有一点需要注意:保留的对象被推送到当前的自动释放池中,因此您可以获取对象的临时所有权以将其从集合中删除然后将其返回给调用者。还有其他用途,但它们主要与获取对象的临时所有权有关。

这些行为也会出现在相应的属性修饰符中(strongunsafe_unretainedweak)。

请参阅Clang Automatic Reference Counting Technical Specification

编辑:对于那些没有针对iOS 5的用户,因此无法获得__weakMike 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。属性修饰符为strongunsafe_unretainedweak

在LLVM / Clang文档中查看section 4 of Automatic Reference Counting