我目前在理解Obj-C块和__block存储类型基础方面遇到了困难。以下是官方文档:
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW6
我试图理解以下段落和示例:
当块被复制时,会对块中使用的对象变量创建强引用。如果你在方法实现中使用一个块:
如果通过引用访问实例变量,则会对self创建一个强引用; 如果通过值访问实例变量,则会对该变量创建一个强引用。 以下示例说明了两种不同的情况:
如果通过引用访问实例变量,则会对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“按值使用”?
- 文档中的“强引用是对self的引用”,是指哪个“self”?
- 如果我在第二个示例中向localVariable添加__block存储类型,那么我是否错误地假设该块封闭了该变量,因此在堆中保留它直到块被释放?还有其他事情发生了吗?
谢谢!