Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 块中块导致自身被保留,\块不工作_Objective C_Ios_Block - Fatal编程技术网

Objective c 块中块导致自身被保留,\块不工作

Objective c 块中块导致自身被保留,\块不工作,objective-c,ios,block,Objective C,Ios,Block,添加:复制函数内的块时出现问题: [正楷] 我已经在使用_u块来避免保留自我。 __块类型(self)bself=self 但是,当此块中存在另一个块并且它使用bself时,self仍将保留 如下面的代码所示,第一个bself将不会像预期的那样保留自我。然而,第二个自我将保留自我 __block typeof(self) bself = self; [layer start:param1 completeHan

添加:复制函数内的块时出现问题: [正楷]

我已经在使用_u块来避免保留自我。 __块类型(self)bself=self

但是,当此块中存在另一个块并且它使用bself时,self仍将保留

如下面的代码所示,第一个bself将不会像预期的那样保留自我。然而,第二个自我将保留自我

            __block typeof(self) bself = self;

            [layer start:param1
                  completeHanlder:^{
                      bself.xx = localxx;

                      dispatch_async(dispatch_get_main_queue(), ^(void) {
                          ... ...
                          [bself something];
                      });
                  }
             ];

有人知道背后的原因吗?

你做错了,但这是对的,这里是错误:

__挡块

这用于在块内提供强引用。例如,可以在块外更改值

正确的方法是使用_弱,它将从实例接收弱引用,并防止强循环引用,如下所示:

 __weak typeof(self) bself = self;

而且因为您创建的_块保留和强引用:)

我不知道它背后的原因,但您可以始终使用与在外部块中避免自引用相同的技巧,在外部块中声明一个
bself2
,在内部块中引用。@dasblinkenlight我已经尝试过,但仍然相同,您是否尝试将
\uu块
更改为
\uu弱
?由于您不打算修改变量,
\uuu-weak
可能会更好。嗯,我只是尝试了一下,它不会阻止阻塞。现在的重新计数是3。每个bself用法保留一次。它在ARC下需要较弱,ARC仍将保留块变量。