3

いくつかの動的アイテムを含むNSMenuがあります。これらのアイテムはNSMenuDelegateのmenuNeedsUpdateメソッドで作成され、それぞれにrepresentedObjectが割り当てられます。オブジェクトグラフをトリミングし、メニューを閉じたときにすべての動的アイテムを削除して(そしてメニューを再度開いたときにそれらを再作成することで)少しのメモリを取り戻すことを望んでいます。私が抱えている問題は、これをどこでどのように処理すべきかを正確に知ることです。

ドキュメントには、NSMenuのmenuDidCloseはメニューの内容を更新するのに適した場所ではないと記載されています。NSMenuDidEndTrackingNotificationをリッスンする通知を設定し、NSMenuのremoveItem:メソッドを呼び出して、その時点で動的アイテムを削除しています。これはこの状況を処理する正しい方法ですか?

最後に、NSMenuItemでremoveItemを呼び出すと、それに割り当てられている可能性のあるカスタムビュー、およびサブメニューが正しく無効になることを保証できますか?

4

1 に答える 1

1

私は最近この問題を抱えていました。あなたは絶対に正しいです。menuDidClose:メニュー項目を削除する場所ではありません。やってみたのですが、メニュー項目からアクションメソッドが送られなくなってしまいました。私が見る限り、正しい解決策はNSMenuDidEndTrackingNotification通知を使用することであることがわかりました。また、うまく機能します。

はい、removeItemメニュー項目を解放する必要があります。ビューを明示的に割り当てるカスタムNSMenuItemサブクラスがある場合は、もちろん、必要に応じてdeallocメソッドを実装する必要があります。ガベージ コレクションを使用している場合は、これについてまったく心配する必要はありません。いずれにせよ、リークがないことを確認するために、常に Instruments を使用する必要があります。

于 2011-07-30T15:52:37.170 に答える