苹果关于此事的文档指出:
复制块时,它会创建对块内使用的对象变量的强引用。如果在方法的实现中使用块:
如果通过引用访问实例变量,则会对 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);
});
但对我来说这毫无意义。如何按值访问实例变量?您不是总是通过引用访问它吗?无论是它self.myVariable
还是只是id newName = self.myVariable
,它总是被引用。
那么这个例子不是太清楚他们的意思。为什么在第一种情况下是自我保留而在第二种情况下不是?它没有在任何地方使用,那么为什么要阻止捕获它呢?