8

ビュー コントローラーが、gcd キューを作成する行でモデル クラス メソッドを呼び出すと、メモリ リークが発生します。何か案は?

+(void)myClassMethod {
    dispatch_queue_t myQueue = dispatch_queue_create("com.mysite.page", 0); //run with leak instrument points here as culprit
    dispatch_async(myQueue, ^{});
}
4

2 に答える 2

18

に変更する必要があります...

dispatch_queue_t myQueue = dispatch_queue_create("com.mysite.page", 0);
dispatch_async(myQueue, ^{});
dispatch_release(myQueue);

...dispatch_releaseキューへのアクセスが不要になったら呼び出す必要があります。myQueueローカル変数と同様に、そこで呼び出す必要があります。

dispatch_queue_create のドキュメントを読む:

討論

キューに送信されたブロックは、FIFO 順で一度に 1 つずつ実行されます。ただし、独立したキューに送信されたブロックは、互いに同時に実行される場合があることに注意してください。

アプリケーションがディスパッチ キューを必要としなくなったら、dispatch_release 関数で解放する必要があります。キューに送信された保留中のブロックは、そのキューへの参照を保持するため、すべての保留中のブロックが完了するまで、キューの割り当ては解除されません。

于 2011-03-23T20:51:43.047 に答える
4

Leak ツールは、コードからの参照がなくなったメモリが割り当てられている場所を報告します。

そのメソッドが実行された後、作成したキューへの参照を持つものは何もなく、dispatch_release() が呼び出されなかったため、リークと見なされます。

于 2011-03-23T20:50:46.890 に答える