retainCount
次の質問の単語が表示される前に、[OK ]を押してください。使用を停止したと述べた下部の[編集]にスキップしてください。
MRRを使用する私のCocoaアプリは、呼び出されるmain()
前に、ロードしている多くのグローバルリソースを作成します。戻らないので、次のように、を使用してこれらのリソースのクリーンアップをフックしましNSApplicationMain()
た。NSApplicationMain()
atexit()
atexit(cleanup);
if (![CocoaUtil initCocoaUtil] ||
![PreferenceController initPreferenceController] ||
![ResourceManager initResourceManager])
{
criticalAlertPanel(@"Failed to initialize application",
@"Failed to initialize application");
return 4;
}
retval = NSApplicationMain(argc, (const char **)argv);
ただし、サブクラスのビューが'dcleanup()
になる前に呼び出されるため(これを示すログメッセージがありません)、グローバルリソース内のオブジェクトの参照カウントが時々発生します。私は慎重すぎて、この方法を使用してグローバルリソースを解放することにより、メモリリークを回避しようとしています。NSDocument
dealloc
> 1
+ (void)fullRelease:(id)obj
format:(NSString *)format, ...
{
if (obj == nil)
return;
NSUInteger retainCount = [obj retainCount];
if (retainCount > 1)
{
va_list va;
va_start(va, format);
NSString *objDesc = [[NSString alloc] initWithFormat:format arguments:va];
logwrn(@"%@ has a reference count of %lu", objDesc, retainCount);
[objDesc release];
}
while (retainCount > 0)
{
[obj release];
retainCount--;
}
}
私のログには次のように表示されます。
12:15:04.954 INF -[AppController applicationDidFinishLaunching:] Application launched
12:15:06.702 INF -[AppController applicationShouldTerminate:] Application terminating
12:15:06.703 INF -[AppController applicationWillTerminate:] Application terminating
12:15:06.705 DBG cleanup Cleaning-up
12:15:06.705 INF +[ResourceManager finiResourceManager] Cleaning up
12:15:06.709 WRN +[CocoaUtil fullRelease:format:] _images[2] has a reference count of 2
12:15:06.709 WRN +[CocoaUtil fullRelease:format:] _images[3] has a reference count of 2
12:15:06.709 WRN +[CocoaUtil fullRelease:format:] _images[4] has a reference count of 2
12:15:06.710 WRN +[CocoaUtil fullRelease:format:] _images[5] has a reference count of 2
12:15:06.710 WRN +[CocoaUtil fullRelease:format:] _images[6] has a reference count of 2
12:15:06.710 WRN +[CocoaUtil fullRelease:format:] _images[7] has a reference count of 2
12:15:06.711 WRN +[CocoaUtil fullRelease:format:] _images[8] has a reference count of 2
12:15:06.711 WRN +[CocoaUtil fullRelease:format:] _images[9] has a reference count of 2
12:15:06.721 DBG +[PreferenceController finiPreferenceController] Cleaning up
12:15:06.721 DBG +[CocoaUtil finiCocoaUtil] Cleaning up
私の質問(ついに!)は:
NSDocument
すべてのインスタンスが破棄された後、グローバルリソースを確実にクリーンアップして、これらのフォールスネガティブの取得を停止する方法はありますか?
編集:fullRelease
呼び出しのフックを解除し、リソースに対して通常の処理を実行しましたがrelease
、Instrumentsはメモリリークを検出しなかったため、問題はありませんが、呼び出されるNSDocument
前にオブジェクトが解放されていないように見える理由に興味があります。atexit()