2

メインの ViewController には、次のコードがあります。

- (IBAction)listFunctions:(id)sender //button clicked
{
    FunctionListController *functionListController = [[FunctionListController alloc] initWithWindowNibName:@"FunctionList"];

    NSWindow *functionListWindow = [functionListController window];

    [NSApp runModalForWindow: functionListWindow];

    NSLog(@"done");
}

FunctionListControllerの File's Owner であり、 protocolFunctionList.nibのサブクラスであり、実装しています。NSWindowControllerNSWindowDelegate

の実装は次のFunctionListControllerとおりです。

@implementation FunctionListController

- (id)initWithWindow:(NSWindow *)window
{
    self = [super initWithWindow:window];
    if(self)
    {
        // Initialization code here.
    }

    return self;
}

- (void)windowDidLoad
{
    [super windowDidLoad];

    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
    self.window.delegate = self;
}

- (void)windowWillClose:(NSNotification *)notification
{
    [NSApp stopModal];
}

@end

モーダル ウィンドウを閉じるとNSLog(@"done");実行されて表示されますが、終了後listFunctionsに EXC_BAD_ACCESS エラーが発生します。

NSZombiesEnabledエラーが発生します[NSWindow _restoreLevelAfterRunningModal]: message sent to deallocated instance

編集:

ARCを使用しています。

4

3 に答える 3

4

[functionListWindow setReleasedWhenClosed:NO]閉じるまでウィンドウへの強力な参照を保持してみてください。

于 2016-07-08T05:35:50.373 に答える
1

listFunctionsメソッドでは、最初にオブジェクトを作成しますFunctionListController

- (IBAction)listFunctions:(id)sender //button clicked
{
    FunctionListController *functionListController = [[FunctionListController alloc] initWithWindowNibName:@"FunctionList"];

これはローカル変数を介して参照されます。スコープの最後 (メソッド自体) で解放されます。

次に、への参照を取得しfunctionListController window、モーダルとして実行します。

    NSWindow *functionListWindow = [functionListController window];

   [NSApp runModalForWindow: functionListWindow];

このオブジェクトは によって保持されますNSApp

ただし、メソッドは終了し (runModalForWindowスレッドをブロックしません)、functionListController割り当てが解除されます。

   NSLog(@"done");
}

そのため、ダングリング参照と、もはや存在しないオブジェクトが所有するモーダル ウィンドウを取得します。したがって、クラッシュします。

単純に、クラスのプロパティを作成functionListControllerするだけで機能します。strong

あなたの新しいlistFunctionsものは次のようになります:

- (IBAction)listFunctions:(id)sender //button clicked
{
    self.functionListController = [[FunctionListController alloc] initWithWindowNibName:@"FunctionList"];
    ...
于 2012-09-02T19:21:38.013 に答える
0

YourはメソッドfunctionListWindow内のローカル変数です。listFunctions:そのメソッドの実行が終了すると、そのオブジェクトへの強力な参照が失われるため、そのオブジェクトを所有するものは何もなくなり、割り当てが解除されます。モーダル ウィンドウが実際に閉じると、デリゲートに適切なメッセージを送信しようとしますが、これはもはや存在しません。

functionListWindowメイン ビュー コントローラーでインスタンス変数を作成してみましたか?

于 2012-09-02T19:18:25.037 に答える