我目前无法理解 Obj-C 块和 __block 存储类型的基础知识。从以下文档:
我试图理解以下段落和示例:
复制块时,它会创建对块内使用的对象变量的强引用。如果在方法的实现中使用块:
如果通过引用访问实例变量,则会对 self 进行强引用;如果您按值访问实例变量,则会对该变量进行强引用。以下示例说明了两种不同的情况:
dispatch_async(queue, ^{
// instanceVariable is used by reference, a strong reference is made to self
doSomethingWithObject(instanceVariable);
});
id localVariable = instanceVariable;
dispatch_async(queue, ^{
/*
localVariable is used by value, a strong reference is made to localVariable
(and not to self).
*/
doSomethingWithObject(localVariable);
});
要覆盖特定对象变量的此行为,您可以使用 __block 存储类型修饰符对其进行标记。
我的问题:
- 一个示例究竟是如何“通过引用访问”而另一个示例是通过变量访问?为什么 localVariable “按值使用”?
- 文档中的“强烈引用自我”是什么意思?它指的是哪个“自我”?
- 如果我在第二个示例中将 __block 存储类型添加到 localVariable ,我是否错误地假设块关闭了变量,因此它将它保留在堆中直到块被释放?还有哪些事情正在发生?
谢谢!