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 类似,但它有一个警告:保留的对象被推送到当前的自动释放池中,因此您可以例如获取对象的临时所有权以将其从集合中删除,然后将其返回给来电者。这还有其他用途,但它们主要与获得对象的临时所有权有关。

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

见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到底怎么可能是nonatomicweak根据定义atomic @JacobRelkin。这是个好问题。我会假设非原子被弱修饰符所掩盖。但这就是它的完成方式;只是为了检查我开始了一个新的 Xcode 项目,添加了一个标签,然后连接了一个插座,确定它给了我'@property (weak, nonatomic) IBOutlet UILabel *label;'。【参考方案3】:

类型限定符是__autoreleasing__strong__unsafe_unretained__weak。属性修饰符为strongunsafe_unretainedweak

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

【讨论】:

以上是关于ARC 引入了哪些新的类型限定符?的主要内容,如果未能解决你的问题,请参考以下文章

尾随返回类型的“覆盖”限定符在哪里?

ARC简介和注意事项(学习笔记1)

C++杂谈const限定符与const指针

const 不兼容的类型限定符问题

精通C语言ANSI C 类型限定符const,volatile,restrict,_Atomic

精通C语言ANSI C 类型限定符const,volatile,restrict,_Atomic