1

私は現在、Aaron Hillegaas による有名な「OSX 用の Cocoa プログラミング」に取り組んでいます。

第12章で、彼は私にaboutウィンドウを作成してほしいと言っています

[BOOL] successful = [NSBundle loadNibNamed:@"About" owner:self];

それ自体で、完全にうまく機能します。ただし、ガベージ コレクターを使用しており、ウィンドウに関するポインターを保持していないため、ガベージ コレクターが収集され、1、2 秒後に消えます。ガベージ コレクションが無効になっている場合は、完全に機能します。

ウィンドウへのポインターを保持せずに、ガベージコレクターに食べさせずにウィンドウを作成する方法はありますか?

4

1 に答える 1

2

でウィンドウを保持することもCFRetain、 を使用することもできNSGarbageCollectorますdisableCollectorForPointer:。ただし、メモリ リークは簡単に発生する可能性があります。ウィンドウを閉じるために使用するアクションが、ウィンドウも解放することを確認してください。

close アクションにsender渡された が から継承されてNSViewいるwindow場合、ウィンドウへのポインターを取得するために使用できるプロパティがあります。

ただし、これは Cocoa が機能するように設計された方法ではありません。Hillegaas の本の第 12 章で、彼は次のように述べています。

showWindow: が初めて送信されると、NSWindowController は自動的に nib ファイルをロードし、ウィンドウを画面上で前面に移動します。nib ファイルは一度だけロードされます。ユーザーが [ウィンドウ] を閉じると、ウィンドウは画面外に移動しますが、割り当ては解除されません。次にユーザーが [window] を要求すると、単に画面上で移動されます。

[バージョン情報] ウィンドウの割り当てを解除すると、アプリがクラッシュするか、2 回目に開いたときに応答しないように見えます。

編集: 別の方法 (ただし、nib をロードする練習にはなりません) は、About ウィンドウと NSWindowController をメイン nib に追加することです (About ウィンドウの "Visible At Launch" 属性のチェックを外してください)。これは Main.nib を混乱させますが、完全に Interface Builder で行うことができます。接続:

  • About コントローラのウィンドウ アウトレットから About ウィンドウへ
  • showWindow:About メニュー項目へのAbout コントローラーのアクション
  • バージョン情報ウィンドウに独自の閉じるボタンがある場合は、それをウィンドウのperformClose:アクションに接続します。

このコースがどれほどお勧めかについて、Apple は次のように述べています

非常に単純なアプリケーションでは、すべてのユーザー インターフェイス コンポーネントを 1 つの nib ファイルに格納できる場合がありますが、ほとんどのアプリケーションでは、コンポーネントを複数の nib ファイルに分散する方が適切です。小さな nib ファイルを作成すると、すぐに必要なインターフェイスの部分だけをロードできます。nib ファイルが小さいほど、アプリケーションのパフォーマンスが向上します。また、問題を探す場所が少なくなるため、発生する可能性のある問題のデバッグが容易になります。

于 2010-03-04T20:07:13.017 に答える