【发布时间】:2011-12-18 11:10:54
【问题描述】:
自动引用计数 (ARC) 引入了一些新的类型限定符。我见过__strong 和__weak,但它们是做什么用的?
【问题讨论】:
标签: objective-c ios memory-management automatic-ref-counting
自动引用计数 (ARC) 引入了一些新的类型限定符。我见过__strong 和__weak,但它们是做什么用的?
【问题讨论】:
标签: objective-c ios memory-management automatic-ref-counting
__strong 表示在赋值时,表达式的右值将被保留并使用原始语义存储到左值中。 (要解除分配这样的对象,您只需分配它nil,之前引用的对象将被释放,nil 将被保留,实际上什么都不做,它是桃子和奶油。)
__unsafe_unretained 和__weak 在将右值的地址分配给左值的意义上是相似的,但是如果您使用__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(和实现)的好处的用户可以使用它们来清零弱引用。
【讨论】:
unsafe__unretain 对象更安全?我的意思是,如果它没有被编译器自动转换为nil,那么我们应该如何处理那个悬空的对象?
__weak在以后的iOS版本中是不可用的,那么在那种情况下我要如何让unsafe__unretain对象更安全,它没有自动设置为nil ?
Strong 告诉 ARC 保留该属性。
@property (strong,nonatomic) NSObject *object;
@property (retain,nonatomic) NSObject *object;
Weak 本质上是赋值,一个未保留的属性。除了对象被释放时,弱指针会自动设置为 nil。
@property (weak,nonatomic) NSObject *object;
@property (assign,nonatomic) NSObject *object;
Weak 仅适用于 iOS 4.3 及更高版本。如果你想以 iOS 4.2 为目标,你需要使用 unsafe_unretained,它的工作方式与之前的 assign 完全相同。
【讨论】:
weak 仅在 Lion 之后可用;你的 iOS 4.2 建议也适用于 Snow Leopard。
weak到底怎么可能是nonatomic? weak根据定义是atomic。
类型限定符是__autoreleasing、__strong、__unsafe_unretained 和__weak。属性修饰符为strong、unsafe_unretained 和weak。
查看 LLVM/Clang 文档中的 section 4 of Automatic Reference Counting。
【讨论】: