【问题标题】:Proper use of ARC (Automatic Reference Counting)?正确使用 ARC(自动引用计数)?
【发布时间】:2012-02-21 18:49:51
【问题描述】:

在创建属性时,将所有retains 替换为strong 并将所有assigns 替换为weak 是否正确?

我要切换到 ARC 有什么有用的提示吗?

【问题讨论】:

    标签: objective-c ios properties automatic-ref-counting


    【解决方案1】:

    阅读Transitioning to ARC Release Notes

    使用 Xcode 指南:编辑 > 重构 > 转换为 Objective-C ARC。

    一开始它可能会报告各种问题(在预检查构建阶段),只需尝试修复所有问题,再试一次(构建和失败),最终当所有问题都修复时,它会基本顺利完成,将您的代码留给 ARC。

    请注意,预检查规则比通常的构建设置更严格。

    【讨论】:

      【解决方案2】:

      简短的回答是肯定的。 strongretain 的ARC 等价物,weakassign 的等价物,只是它也是归零(如果对象被释放,则将指针设置为nil,防止潜在的EXC_BAD_ACCESS 崩溃) ,所以比assign还要好。如前所述,Transitioning to ARC Release Notes 页面提供了更多详细信息,如果您有兴趣。

      【讨论】:

      • weak 并不完全等同于分配。 unsafe_unretained 是等价的。 weak 实际上是一个需要运行时支持的新特性(iOS5/OSX10.6 以上)。 .不同之处在于,当对象离开时,weak 会自动设置为 nil,而 assign/unsafe_unretained 可以留下一个悬空指针。
      • 什么鬼,我刚刚评论了一个很老的问题。我到底是怎么来到这里的?我以为我点击了未回答。 . . ARC 那时是新的,毫无疑问你现在知道这一切了。 . .值得一提。
      【解决方案3】:

      据我所知,strongretain 是同义词,所以它们完全相同
      编辑:unsafe_unretained 也是 @987654324 的同义词@,正如 nielsbot 指出的那样。

      那么weak 几乎就像assign,但是在它指向的对象被释放后自动设置为nil。

      这意味着,您可以简单地替换它们。

      但是,我遇到了一种特殊情况,我必须使用assign,而不是weak。假设我们有两个属性delegateAssigndelegateWeak。在两者中都存储了我们的委托,即通过拥有唯一的强引用来拥有我们。委托正在解除分配,所以我们的-dealloc 方法也被调用了。

      // Our delegate is deallocating and there is no other strong ref.
      - (void)dealloc {
          [delegateWeak doSomething];
          [delegateAssign doSomething];
      }
      

      委托已在解除分配过程中,但仍未完全解除分配。问题是 weak 对他的引用已经无效! 属性 delegateWeak 包含 nil,但 delegateAssign 包含有效对象(所有属性都已释放和无效,但仍然有效)。

      // Our delegate is deallocating and there is no other strong ref.
      - (void)dealloc {
          [delegateWeak doSomething]; // Does nothing, already nil.
          [delegateAssign doSomething]; // Successful call.
      }
      

      这是非常特殊的情况,但它向我们揭示了这些 weak 变量如何工作以及它们何时被无效。

      【讨论】:

      • 我认为assignunsafe_unretained在ARC下是等价的
      猜你喜欢
      • 2015-09-29
      • 1970-01-01
      • 2012-03-21
      • 2012-03-13
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多