Instruments は、このメソッドで 100% のリークを報告しています。
+(void)initialize{
mapper = [[NSMutableDictionary alloc] init];
}
Instruments が誤検知を報告しないと仮定すると、どのようなシナリオがこれにつながる可能性がありますか? マルチスレッド(ドキュメントでは「スレッドセーフな方法」で呼び出されると書かれていますが)?
これは非 ARC です。
Instruments は、このメソッドで 100% のリークを報告しています。
+(void)initialize{
mapper = [[NSMutableDictionary alloc] init];
}
Instruments が誤検知を報告しないと仮定すると、どのようなシナリオがこれにつながる可能性がありますか? マルチスレッド(ドキュメントでは「スレッドセーフな方法」で呼び出されると書かれていますが)?
これは非 ARC です。
問題 (非 ARC 環境を想定) は、メモリを割り当ててmapper
も決して解放しないことです。
自動解放プールを使用します。
+(void)initialize {
@autoreleasepool {
mapper = [[NSMutableDictionary alloc] init];
}
}
この場合、オブジェクトを作成すると、オブジェクトが自動解放される可能性があります (たとえば、NSMutableDictionary の実装内で内部または一時的に)。もちろん、これが問題である場合は、コンソールに「... autoreleased with no pool in place -- just leaking」というメッセージが表示されます。
また、共有/グローバルなものを遅延して初期化するか、アプリの起動が完了した後に検討する必要があります。
これらのメッセージが表示されない場合、これは当てはまりません。
問題は、上記のこのクラスのサブクラスがあったことです。ブロック内にalloc
s を設定すると、リークが修正されました。initialize
dispatch_once
Mike Ash のこの投稿initialize
は、 .