NSOperationコードをARCに変換するのが難しいです。私の操作オブジェクトは、補完ブロックを使用します。完了ブロックには、メインスレッドのUIを更新するGCDブロックが含まれています。私自身の補完ブロック内から自分の操作オブジェクトを参照するので、メモリリークを避けるために__weakポインタを使用しています。しかし、私のコードが実行されるまでにポインタはすでにnilに設定されています。ARCで独自の補完ブロックでNSOperationオブジェクトを参照する
私はこのコードサンプルに絞り込みました。誰が私が間違っていたか、そしてこれを達成する正しい方法を知っていますか?
NSOperationSubclass *operation = [[NSOperationSubclass alloc] init];
__weak NSOperationSubclass *weakOperation = operation;
[operation setCompletionBlock:^{
dispatch_async(dispatch_get_main_queue(), ^{
// fails the check
NSAssert(weakOperation != nil, @"pointer is nil");
...
});
}];
弱点は所有権を保持していないということです。変数を保持しているものがない場合(そして存在しない場合)は、パージされます。あなたは 'operation'を使うとリークが起きますか?完了ブロックがリリースされると消えるはずですが、呼び出されるとすぐに消えるはずです。しかし、それは素朴かもしれません。 –
ARCはコンパイル時にそれについて不平を言っていました。それがなければ、私は操作ポインタを直接使用していました(そして私はメモリが漏れているとは思わない)。 –
これで幸運。私は何かをあきらめて何か他のことをする前に数時間苦労したと思う。しかし、それはしばらくしています。 :) –