为什么不保留__block变量(在非ARC环境中)?

时间:2013-06-29 20:57:54

标签: ios objective-c macos objective-c-blocks

我正在阅读__block variables上的文档,并考虑我使用__block的情况。对我来说,似乎我需要两种情况:

  • 在块中使用时将变量标记为读写
  • 避免在块内引用self时保留周期

从表面上看,这两件事似乎并不相关。我认为__block变量不被保留作为避免保留周期的特定用例需要记住的更多技巧。

我想知道,为什么不能保留它们有更重要的建筑理由?我认为其他一些关键字可能会更清楚,以免混淆上面列出的两个功能。

更新 -

我应该提到这是不使用ARC的代码。我现在看到__block变量实际上保留在ARC中。

1 个答案:

答案 0 :(得分:12)

如果使用“手动引用计数”,则不会保留

__block个变量。原因可以在这里找到:http://www.mikeash.com/pyblog/friday-qa-2009-08-14-practical-blocks.html

  

一个简单的解决方法是__block个变量   不保留。这是因为这些变量是可变的,并且   它们的自动内存管理需要每个突变   在幕后生成内存管理代码。这被视为   太过于侵入,很难做对,特别是同样的   block可能同时从多个线程执行。

也在这里:http://lists.apple.com/archives/objc-language/2009/Dec/msg00100.html

  

无法正确有效地管理保留计数   在重新分配变量中的值时。

(我在Apple文档中找不到“官方”参考。)

"Transitioning to ARC Release Notes"中所述,此行为随ARC更改:

  

在手动引用计数模式下,__block id x;具有不起作用的效果   保留x。在ARC模式下,__block id x;默认为保留x(只是   像所有其他值一样)。获得手动引用计数模式   ARC下的行为,您可以使用__unsafe_unretained __block id x;。   正如名称__unsafe_unretained暗示的那样,有一个   非保留变量是危险的(因为它可以悬挂)并且是   因此气馁。两个更好的选择是使用__weak(如果   您不需要支持iOS 4或OS X v10.6),或设置__block   值为nil以打破保留周期。