2

理由はわかりませんが、シンプル[[NSOpenPanel openPanel] runModal];にするとメモリ リークが発生します - Leaks Instrument で見られます。

オフのようです。

これは自動解放されるオブジェクトですが、ARpool がドレインされた後に自動的に解放されるべきではありませんか?

これを修正する方法はありますか?

4

4 に答える 4

6

NSOpenPanelシングルトンです。つまり、オブジェクトを使用するたびに、常に同じインスタンスを取得します。これは、最初に を呼び出したとき[NSOpenPanel openPanel]に、 のインスタンスNSOpenPanelが作成され、解放されないことを意味します。

これはリークではなく、最適化です。ただし、Leaks インストゥルメントは、インスタンスが (設計上) 決して解放されないため、このような一度だけのインスタンス化をリークとして検出することがあります。

NSOpenPanelは非常に広く使用され、テストされているクラスであるため、その標準実装にリー​​クが存在する可能性はほとんどありません。

于 2011-08-09T00:54:52.973 に答える
3

NSOpenPanel はシングルトンではありません。かつてはそうだったかもしれませんが、最新の NSOpenPanel.h ファイルを見ると、それがシングルトンではないこと、または少なくとも Apple がこの実装の詳細を利用することを望んでいないことが明確にわかります。

漏れに関しては、開いたパネルをいつ解放するべきか混乱し、保持していました。File System Programming GuideのUsing the Open and Save Panelsセクションから、10.7 以降では作業がずっと楽になります。

Important: In OS X 10.6 and earlier, you must retain an open panel prior to displaying it and release it when you are done with it. Because the openPanel method returns an autoreleased object, the panel is normally released shortly after it appears on screen. Retaining the panel prevents it from being deallocated and dismissed prematurely. You do not need to retain the panel if it is attached to a window and you do not need to retain the panel in OS X 10.7 and when using ARC.

保持をやめると、物事は簡単になり、ずっと簡単になりました:)

于 2013-08-28T01:48:03.307 に答える
0

機器は、特に自動解放されたオブジェクトの場合、リークの検出に完全ではなく、誤検知が発生する傾向があります。新しいNSAutoreleasePoolを作成し、NSOpenPanelを使い終わったらそれを排出して、早期にリリースを強制することもできますが、実際にはリークがないようです。コードが見栄えがよく、自動リリースされると確信している場合は、おそらく問題ありません。

于 2011-08-08T19:00:33.220 に答える