ARC 引入了哪些新的类型限定符?
Posted
技术标签:
【中文标题】ARC 引入了哪些新的类型限定符?【英文标题】:What are the new type qualifiers introduced with ARC? 【发布时间】:2011-12-18 11:10:54 【问题描述】:自动引用计数 (ARC) 引入了一些新的类型限定符。我见过__strong
和__weak
,但它们是做什么用的?
【问题讨论】:
【参考方案1】:__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
?【参考方案2】:
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 完全相同。
【讨论】:
在 Mac OS X 上,weak
仅在 Lion 之后可用;你的 iOS 4.2 建议也适用于 Snow Leopard。
@NJones,不过我有一个问题。 weak
到底怎么可能是nonatomic
? weak
根据定义是atomic
。
@JacobRelkin。这是个好问题。我会假设非原子被弱修饰符所掩盖。但这就是它的完成方式;只是为了检查我开始了一个新的 Xcode 项目,添加了一个标签,然后连接了一个插座,确定它给了我'@property (weak, nonatomic) IBOutlet UILabel *label;'。【参考方案3】:
类型限定符是__autoreleasing
、__strong
、__unsafe_unretained
和__weak
。属性修饰符为strong
、unsafe_unretained
和weak
。
查看 LLVM/Clang 文档中的 section 4 of Automatic Reference Counting。
【讨论】:
以上是关于ARC 引入了哪些新的类型限定符?的主要内容,如果未能解决你的问题,请参考以下文章