benzado が書いた素晴らしい記事を読みました。クラス変数がブロック自体を保持し、ブロックが「自己」を保持している場合、ブロックを使用するとメモリ リークが発生し、保持サイクルが発生します。
API を実装するときにブロック内の自己をキャプチャしないようにするにはどうすればよいですか?
しかし、GCDを使用すると同じ問題が発生する理由がわかりませんか? dispatch_async() のような関数は、クラス自体によってキャプチャされるべきではないローカル変数のように見えますか?
また、公式文書には、ブロックに autorelease を入れて、オブジェクトが時間内にリリースされるようにする必要があると書かれています。
私の IOS プロジェクトのほとんどでは、次のように GCD を使用しています。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) {
NSDictionary *resultDic = [MyService loadData];
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate useData:resultDic];
});
});
今、私はそれらすべてをに変更する必要があります
__block MyClass *blockSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) {
@autoreleasepool{
NSDictionary *resultDic = [MyService loadData];
dispatch_async(dispatch_get_main_queue(), ^{
@autoreleasepool{
[blockSelf.delegate useData:resultDic];
}
});
}
});
??
汚れて見えます。誰かが正しい方法でそれを行う方法の手がかりを持っていますか?
ところで、ブロックでいくつかの関数を呼び出し、その関数で「self」または「self.delegate」を使用した場合、すべてを別のものに変更する必要があるということですか? (そして、それを修正するために何をすべきかわかりません)
参考までに、私の IOS プロジェクトは IOS8.1 および非 ARC環境でビルドされています。