4

私が知りたいのは、私が初期化するウィンドウコントローラーはどのようになっているのかということです

NSWindowController *c=[[NSWindowController alloc] initWithWindowNibName:@"Win" owner:myObj]

myObjがコントローラー自体ではない場合、Win.xibファイルでどのウィンドウを制御する必要があるかを知っていますか?通常、私はウィンドウコントローラーを所有者として設定し、そのウィンドウをIBでアウトレットに設定できるようにします。所有者でなくても、メモリ管理はすべてウィンドウコントローラによって行われますか?

4

2 に答える 2

1

ウィンドウコントローラは、所有者でなくても、最上位オブジェクトのメモリ管理を行います。NSWindowController クラスリファレンスから:

ファイルの所有者が誰であるかに関係なく、ウィンドウコントローラは、ロードするnibファイル内のすべての最上位オブジェクトを解放する責任があります。

ただし、ウィンドウコントローラは通常、NIBの所有者であり、そのウィンドウアウトレットを接続することで、通常、どのウィンドウを制御するかを知ることができます。このメソッドを使用し-setWindow:て明示的に設定することもできます。

NIBの最上位オブジェクトでウィンドウをNSWindowController検索して、コンセントが接続されていないかどうかを制御することも考えられますが、そうは思われません。

理解できない行動を観察したことがありますか?それが何だった?

于 2013-02-09T20:34:38.757 に答える
0

このメソッドは、ドキュメントベースのアプリがある場合に存在します。を参照してくださいNSDocument。その場合NSDocument、NIBファイルの所有者のインスタンスを作成します(メソッドNSDocumentはあります-setWindow:が、ゲッターはありません)。コントローラは、ドキュメントインスタンスからウィンドウを認識します。コードは大まかに次のようになります。

NSDocument * document = ...;
NSWindowController * winCtrl = [[NSWindowController alloc]
   initWithWindowNibName:@"SomeNib" owner:document];
[document addWindowController:winCtrl];
[winCtrl loadWindow];

これで、ドキュメントはNIBファイルの所有者になりますが、ウィンドウコントローラは、ドキュメントに割り当てられているウィンドウへの参照を引き続き受け取ります。

もちろん、このコードはデモンストレーションのみを目的としています。実際には、必要なすべてのコントローラーをサブクラス化してNSDocumentオーバーライドし、開始するのが正しい方法です。makeWindowControllers

ドキュメントに常に単一のNIBファイルからの単一のウィンドウしかない場合は、NSDocumentプロパティをNIBファイルの名前に設定してから、デフォルトの実装をwindowNibName呼び出すこともできます。これにより、おおまかに次のようになります。makeWindowControllers

NSWindowController * winCtrl = [[NSWindowController alloc]
   initWithWindowNibName:self.windowNibName owner:self];
[self addWindowController:winCtrl];

また、GNUStepの実装を確認してくださいNSWindowController。これはAppleのものとは異なる場合があります(Appleのものはオープンソースではないため、わかりません)が、動作は同じである必要があります。

- (void) loadWindow
{
  NSDictionary *table;

  if ([self isWindowLoaded]) 
    {
      return;
    }

  table = [NSDictionary dictionaryWithObject: _owner forKey: NSNibOwner];
  if ([NSBundle loadNibFile: [self windowNibPath]
        externalNameTable: table
        withZone: [_owner zone]])
    {
      _wcFlags.nib_is_loaded = YES;

      if (_window == nil  &&  _document != nil  &&  _owner == _document)
        {
          [self setWindow: [_document _transferWindowOwnership]];
        }
      else
        {
          // The window was already retained by the NIB loading.
          RELEASE(_window);
        }
    }
  else
    {
      if (_window_nib_name != nil)
        {
      NSLog (@"%@: could not load nib named %@.nib", 
         [self class], _window_nib_name);
    }
    }
}

ソース: https ://github.com/gnustep/libs-gui/blob/master/Source/NSWindowController.m

プライベートメソッドを使用してドキュメントからウィンドウを取得しますが_transferWindowOwnership、ロード後にウィンドウが設定されていない場合にのみ、ドキュメントが設定され、このドキュメントがロードされたNIBファイルの所有者として設定されます。

于 2019-04-04T15:04:49.200 に答える