0

追加: 関数内のブロックをコピーすると問題が発生: [ブロック コピー]

私はすでに自己保持を避けるために __block を使用しています。__block typeof(self) bself = self;

ただし、このブロックに別のブロックがあり、それが bself を使用している場合、self は保持されます。

以下のコードに示すように、最初の bself は想定どおりに self を保持しません。ただし、2番目の自己は自己を保持します。

            __block typeof(self) bself = self;

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

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

背後にある理由を知っている人はいますか?

4

1 に答える 1

-1

あなたは間違っていますが、それは正しいと考えています。ここにエラーがあります:

__ブロック

これは、ブロック内で強い参照を行うために使用されます。たとえば、ブロックの外で値を変更できます。

正しい方法は、インスタンスから弱い参照を受け取り、次のような強いループ参照を防ぐ __weak を使用することです。

 __weak typeof(self) bself = self;

そして、あなたが作成した __block は保持と強い参照のため:)

于 2015-08-26T11:59:09.647 に答える