追加:問題は私が関数の中のブロックをコピーするときに起こります: [ブロックコピー]
私はすでに自己保持を避けるために__blockを使っています。 __block typeof(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];
});
}
];
誰もが背後にある理由を知っていますか?
回答:
回答№1の場合は-1あなたは間違ったことをしています、しかし、それが正しいという概念、ここでエラー:
__ブロック
これはあなたのブロックの中で強い参照をさせるために使われます。たとえば、ブロックの外側で値を変更することができます。
正しい方法は__weakを使用することです。これはあなたのインスタンスから弱い参照を受け取り、このような強いループ参照を防ぐでしょう:
__weak typeof(self) bself = self;
そしてあなたが作成した__blockは保持し、強い参照をしているので:)