1

Instruments は、このメソッドで 100% のリークを報告しています。

+(void)initialize{
    mapper = [[NSMutableDictionary alloc] init];
}

Instruments が誤検知を報告しないと仮定すると、どのようなシナリオがこれにつながる可能性がありますか? マルチスレッド(ドキュメントでは「スレッドセーフな方法」で呼び出されると書かれていますが)?

これは非 ARC です。

4

3 に答える 3

2

問題 (非 ARC 環境を想定) は、メモリを割り当ててmapperも決して解放しないことです。

于 2012-08-28T18:00:42.877 に答える
1

自動解放プールを使用します。

+(void)initialize {
    @autoreleasepool {
      mapper = [[NSMutableDictionary alloc] init];
    }
}

この場合、オブジェクトを作成すると、オブジェクトが自動解放される可能性があります (たとえば、NSMutableDictionary の実装内で内部または一時的に)。もちろん、これが問題である場合は、コンソールに「... autoreleased with no pool in place -- just leaking」というメッセージが表示されます。

また、共有/グローバルなものを遅延して初期化するか、アプリの起動が完了した後に検討する必要があります。

これらのメッセージが表示されない場合、これは当てはまりません。

于 2012-08-28T18:03:31.843 に答える
1

問題は、上記のこのクラスのサブクラスがあったことです。ブロック内にallocs を設定すると、リークが修正されました。initializedispatch_once

Mike Ash のこの投稿initializeは、 .

于 2012-08-29T22:42:25.130 に答える