Iphone 苹果对块中的对象进行消去

Iphone 苹果对块中的对象进行消去,iphone,ios,objective-c-blocks,retain-cycle,Iphone,Ios,Objective C Blocks,Retain Cycle,苹果公司关于此事的文件说明: 复制块时,它会创建对对象的强引用 块中使用的变量。如果在 方法的实现: 如果通过引用访问实例变量,则需要使用强引用 自制的 如果您通过值访问实例变量,则需要强引用 对变量进行了修改 还有一个代码示例: dispatch_async(queue, ^{ // instanceVariable is used by reference, a strong reference is made to self doSomethingWithObject(instance

苹果公司关于此事的文件说明:

复制块时,它会创建对对象的强引用 块中使用的变量。如果在 方法的实现:

如果通过引用访问实例变量,则需要使用强引用 自制的

如果您通过值访问实例变量,则需要强引用 对变量进行了修改

还有一个代码示例:

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
,它都是通过引用实现的


那么这个例子就不太清楚它们的意思了。为什么在第一种情况下是自我约束,而在第二种情况下不是?它没有在任何地方使用,那么为什么块会捕获它呢?

当您使用实例变量时,编译器会将您看到的ivar名称转换为
self->ivar
,而这正是块所使用的。您甚至可以在您的代码中执行此操作—尝试使用
self->
预先设置的工具访问某些内容

编辑:所以在第一种情况下,块捕获
self
,因为它需要它来访问
instanceVariable
,就像
self->instanceVariable
一样。因此,当块最终执行时,它将使用任何值。因为
self
是一个对象,所以它会被保留


在第二种情况下,临时变量(对象或非对象)被指定为
self->instanceVariable
的当前值,无论该值是什么。当块捕获
localVariable
时,它保留对象,并且在dispatch\u async调用之后,ARC释放
localVariable
,因此块现在是唯一保留
localVariable
的对象。从那时起,该类可以更改实例变量,并且对捕获的块没有任何影响(一个例外-如果对象是可变对象,那么块在运行时将使用任何内容-这就是在这种情况下不使用可变对象的原因,而是使用不可变副本的原因。

感谢您花了大量时间和精力尝试回答,但您是否阅读了我的问题?我想还需要一些信息。还有一个问题,如果我们写了uu弱id localVariable,块还会保留localVariable吗?不会。这样做的方法是创建一个弱变量“weakSelf”-参见。我写了一篇关于weakSelf和strongSelf的博客,现在来做更复杂的块:-它引用了上面的llvm站点,并告诉您上面提到的章节。