我正在阅读__block variables上的文档,并考虑我使用__block的情况。对我来说,似乎我需要两种情况:
从表面上看,这两件事似乎并不相关。我认为__block变量不被保留作为避免保留周期的特定用例需要记住的更多技巧。
我想知道,为什么不能保留它们有更重要的建筑理由?我认为其他一些关键字可能会更清楚,以免混淆上面列出的两个功能。
更新 -
我应该提到这是不使用ARC的代码。我现在看到__block变量实际上保留在ARC中。
答案 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
以打破保留周期。