3

モーダルを表示するNSWindow/Controllerがあります。次のようなアクションに接続された「閉じる」ボタンがあります。

- (IBAction)close:(id)sender
{
    [self.window orderOut:sender];
    [self.window close];

    [[NSApplication sharedApplication] stopModal];
}

メインウィンドウから、モーダルを表示します。

- (IBAction)modal:(id)sender
{
    NSLog(@"Before: %lu", [[[NSApplication sharedApplication] windows] count]);

    ModalWindowController *modal = [[ModalWindowController alloc] initWithWindowNibName:@"ModalWindowController"];
    [[NSApplication sharedApplication] runModalForWindow:modal.window];

    NSLog(@"After: %lu", [[[NSApplication sharedApplication] windows] count]);
}

モーダルを数回開いたり閉じたりすると、出力は次のようになります。

2013-01-17 14:36:08.071 Modals[3666:303] Before: 1
2013-01-17 14:36:08.962 Modals[3666:303] After: 2
2013-01-17 14:36:09.578 Modals[3666:303] Before: 2
2013-01-17 14:36:11.009 Modals[3666:303] After: 3
2013-01-17 14:36:12.108 Modals[3666:303] Before: 3
2013-01-17 14:36:12.910 Modals[3666:303] After: 4

したがって、[[[NSApplication sharedApplication]windows]count]は増加するだけです。

モーダルウィンドウを開いたり閉じたりすると、増減することが予想されます。私のアプリケーションはARCを使用しています。誰かが私にこれを説明できますか?

前もって感謝します

4

3 に答える 3

3

ウィンドウを閉じていますが、ウィンドウコントローラーModalWindowControllerがまだウィンドウを保持しているため、ウィンドウの割り当てを解除していません。サンプルには、ウィンドウ コントローラーが解放されていることを示すものは何もありません。

最も簡単な答えは、 への呼び出しに続いてウィンドウ コントローラーを解放することです-runModalForWindow:

あなたが期待しているのは、ウィンドウが閉じるときにウィンドウコントローラーが閉じることです。それはあなた自身が実現しなければならないことです。Apple のドキュメントの「ウィンドウを閉じる動作」から:

ウィンドウがドキュメントの一部ではないときにウィンドウとウィンドウ コントローラーの両方を非表示にする場合は、NSWindowController のサブクラスで NSWindowWillCloseNotification を観察するか、ウィンドウ デリゲートとして windowWillClose: メソッドを実装し、次のコードを含めます。実装のコード行: "[self autorelease];"

あなたのシナリオでは、これは最善のアプローチではないかもしれません-stopModal.

于 2013-01-17T19:54:35.163 に答える
2

このNSWindowメソッドを見てください:

- (void)setReleasedWhenClosed:(BOOL)releasedWhenClosed;

YESに設定すると、閉じたときにウィンドウが解放されます。ただし、カウントがゼロになると割り当てが解除されることに注意してください。

于 2013-01-17T19:56:44.463 に答える