2010-11-23 10 views
1

私は過去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の下で非常に漏れていると話していました。私はそれがここにも当てはまるのだろうかと思います。

コミュニティからのご意見はありますか?

+0

あなたはなぜ[[NSScreen screens]]を自動リリースしていますか?あなたはそれを所有していません。 –

+0

Peter、私が持っていた問題は、コールによって作成されたバックグラウンドコアグラフィックスオブジェクトが決してリリースされなかったことです。私は上記の例ではオートレリーズが何もしなかったことを認めますが、それは基礎的なCGオブジェクトが解放されることを望むことでした。 –

+0

それは問題ではありません。あなたは自分が所有していないものを決して解放してはいけません。たとえそれが "助け"を受けたとしても、それはまだ間違っていて、アップルがバグを修正したときにクラッシュする可能性があります。さらに、GCの下で実行しているので、保持、解放、および自動解放メッセージはとにかく実行されません。ランタイムはそれらを完全に無視します。 http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/ –

答えて

1

ここで私は手足を外に出て、それはAppleの部分のバグだと言いますが、Toll-Free-Bridgingの魔法を使って解決策を見つけました。私がするコードを変更:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

NSRect desktopRect = NSZeroRect; 

CFArrayRef screens = CFMakeCollectable((CFArrayRef)[NSScreen screens]); 
int x = 0; 
for (x = 0; x < [screens count]; x++) 
{ 
    NSScreen *screen = (NSScreen*)CFArrayGetValueAtIndex(screens,x); 
} 

[pool drain]; 

フリーダイヤル架橋アレイ上CFMakeCollectableを呼び出すことによって、それがガベージコレクションを使用したときに、背景コアグラフィックスオブジェクトが適切にクリーンアップすることを可能にしました。

これは間違いなく、AppleがCore GraphicsをラップするガベージコレクションとCocoaオブジェクトでもう少し作業をする必要があると私に思います。

+0

また、NSMakeCollectableを使用して、それをNSArrayとして扱います。 Appleがこのバグを修正した場合、これがあなたにとって安全であるかどうかはわかりません。 RadarWebのバグを報告するだけで、今のところリークさせることができますhttps://bugreport.apple.com/ –

関連する問題