我正在解决一些有关块/ARC 的保留周期问题,并且我正在努力解决这些细微差别。任何指导表示赞赏。
Apple 关于“块和变量”的文档 (http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html) 说明如下:
如果在方法的实现中使用块,对象实例变量的内存管理规则会更加微妙:
如果通过引用访问实例变量,则保留 self;如果您按值访问实例变量,则会保留该变量。以下示例说明了两种不同的情况:
dispatch_async(queue, ^{
// instanceVariable is used by reference, self is retained
doSomethingWithObject(instanceVariable);
});
id localVariable = instanceVariable;
dispatch_async(queue, ^{
// localVariable is used by value, localVariable is retained (not self)
doSomethingWithObject(localVariable);
});
我觉得这个解释令人困惑。
- 这是对“按价值”/“按参考”术语的适当使用吗?假设这些变量属于同一类型(id),它们之间的区别特征似乎是它们的范围。
我看不到“通过引用”示例中如何引用 self ?如果正在使用访问器方法(例如 - 下面),我可以看到 self 被保留。
doSomethingWithObject(self.instanceVariable);
您对何时可能想要以一种或另一种方式做事有任何指导吗?
- 如果传统智慧是利用“按值”变量,那么这似乎会导致大量额外的代码用于额外的变量声明?
- 在嵌套块开始发挥作用的情况下,避免在彼此内部声明块似乎更易于维护,因为最终可能会出现一堆无意保留的对象?