【发布时间】:2013-01-05 23:31:06
【问题描述】:
我目前无法理解 Obj-C 块和 __block 存储类型的基础知识。 来自以下文档:
我正在尝试理解以下段落和示例:
复制块时,它会创建对块内使用的对象变量的强引用。如果在方法的实现中使用块:
如果通过引用访问实例变量,则会对自身进行强引用; 如果您按值访问实例变量,则会对该变量进行强引用。 以下示例说明了两种不同的情况:
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 中,我是否错误地假设块关闭了变量,所以它将它保留在堆中直到块被释放?还发生了哪些其他事情?
谢谢!
【问题讨论】:
标签: ios objective-c objective-c-blocks