【问题标题】:What are the new type qualifiers introduced with ARC?ARC 引入了哪些新的类型限定符?
【发布时间】:2011-12-18 11:10:54
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    __strong 表示在赋值时,表达式的右值将被保留并使用原始语义存储到左值中。 (要解除分配这样的对象,您只需分配它nil,之前引用的对象将被释放,nil 将被保留,实际上什么都不做,它是桃子和奶油。)

    __unsafe_unretained__weak 在将右值的地址分配给左值的意义上是相似的,但是如果您使用__weak 限定符,则此操作保证是原子的并且受制于一些不同语义。其中之一是,如果正在分配的对象当前正在进行解除分配,则分配将评估为nil,然后将自动存储回表达式的左值。因此使用__unsafe_unretained 的措辞,因为该操作确实不安全且未保留。

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

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

    Clang Automatic Reference Counting Technical Specification

    编辑:对于那些不以 iOS 5 为目标,因此无法获得 __weakMike 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2014-05-28
      相关资源
      最近更新 更多