私は過去2〜3日間、objective-cプログラムでメモリリークをデバッグしようとしていました。いくつかのアイデアをテストし、それは私のバグだと思っていたが、Macの世界での開発についてもっと知識のある人たちから意見を得たいと思った。NSScreenはGarbageCollectionの下に漏れていますか?これはバグですか?
私は、次のコードのビットを持っている:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSRect desktopRect = NSZeroRect;
NSArray* screens = [[NSScreen screens] autorelease];
int x = 0;
for (x = 0; x < [screens count]; x++)
{
NSScreen *screen = [screens objectAtIndex:x];
}
[pool drain];
このコードは、私は、プロセスを殺すまで継続whileループから呼び出していますメソッドの中に住んでいます。
ガベージコレクションを実装していないときに、このループを実行してInstrumentsで割り当てを監視すると、正常に正常に動作します。割り当ての総数は一定のままで、NSScreensのすべてがクリーンアップされ、解放されています。
ガベージコレクションを有効にするとすぐに、[NSScreen screens]の呼び出しにより、コアグラフィックスオブジェクトがリリースされることはありません。
私は他のフォーラムで、数年前にCore GraphicsがGarbage Collectionの下で非常に漏れていると話していました。私はそれがここにも当てはまるのだろうかと思います。
コミュニティからのご意見はありますか?
あなたはなぜ[[NSScreen screens]]を自動リリースしていますか?あなたはそれを所有していません。 –
Peter、私が持っていた問題は、コールによって作成されたバックグラウンドコアグラフィックスオブジェクトが決してリリースされなかったことです。私は上記の例ではオートレリーズが何もしなかったことを認めますが、それは基礎的なCGオブジェクトが解放されることを望むことでした。 –
それは問題ではありません。あなたは自分が所有していないものを決して解放してはいけません。たとえそれが "助け"を受けたとしても、それはまだ間違っていて、アップルがバグを修正したときにクラッシュする可能性があります。さらに、GCの下で実行しているので、保持、解放、および自動解放メッセージはとにかく実行されません。ランタイムはそれらを完全に無視します。 http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/ –