1

私はこれが100%安全だと確信していますが、何も見逃したくありません。私は次のコードを持っていますこれは安全ですか?ブロック内のシングルトンとしての可能性のある保持サイクル

- (void) scheduleControlSurfaceProcess { 
    [self.operationQueueForMessageProcessing addOperationWithBlock:^{ 
     // do something 
     [self scheduleControlSurfaceProcess];  
    }]; 
} 

ここでselfはシングルトンです。このブロックは非メインスレッドスレッドとして見事に機能します。私はプロファイラにメモリの問題がない(私はあまり信頼していない)。

したがって、「ブロックはキャプチャされたオブジェクトによって強く保持されるオブジェクトによって保持されますか?」という警告は無視できますか?もしそうでなければ、どのように(ARCを使って)ブロックをリリースすると主張できますか?警告を消すのは簡単ですが、id what = selfを割り当てると問題が解決しないようです。

EDIT:私はこの質問にかなり遅れていると感じましたが、本当の問題はブロック自体の中から再スケジュールしていることでした。各ブロックは次のブロックを保持するので、明らかに問題があります。

注:私はlots of questions on this topicがあることを認識していますが、私には専門家ではありません。

答えて

5
- (void) scheduleControlSurfaceProcess { 
    __weak id SELF = self; 
    [self.operationQueueForMessageProcessing addOperationWithBlock:^{ 
     id strongSelf = SELF; //Guarantee self doesn't go away in the meantime 
     // do something 
     [self.operationQueueForMessageProcessing addOperationWithBlock:^{ 
      [strongSelf scheduleControlSurfaceProcess]; 
     }]; 
    }]; 
} 

これは、ここにサイクルがないことを保証します。警告は完全に有効で、自己は操作キューを保持し、キューはブロックを保持し、ブロックは自己を保持します。そしてラウンドラウンド、私たちは行く。

修正された例では、ブロックはSELFをキャプチャして 'strongSelf'に格納します。 strongSelfの手順は厳密には必要ではありませんが、ブロックの実行中にselfへの参照がnilにならないようにします。

+0

+1ありがとうございます。私は本当に驚いていますが、クラッシュログなしの最近のクラッシュについて説明します。私はまだ4.3のためにビルドしている唯一のデベロッパーですか、もしそうなら、1月に出てくるアプリのためにそれは駄目でしょうか?とにかく、4.xが '__unsafe_unretained'を使わなければならないと思います。私の理解では、iPadユーザーの50%以上が4.xを使用しています。 –

+1

すべての新しい開発のために私は5.0+を提案します。 4.xをもうサポートする価値はありません。しかし、そうです、その場合、__weakを__unsafe_unretainedに置き換えてください。 –

+0

今私は本当に混乱しています。私はあなたが提案したように調整した後も、間違いなくブロックをまだ漏らしています。ブロック内から呼び出される 'scheduleControlSurfaceProcess'メソッドのルールは何ですか? Xcodeは確かにこれを解析していません。助けを前にありがとう。 –

関連する問題