1

私はMacアプリケーションを構築しています。に を追加しchildWindowControllerていmainWindowます。私childWindowControllerの には、IB で接続されたアクションを持ついくつかのボタンがあります。しかし、 を押すとNSButton、アプリケーションがクラッシュEXC_BAD_ACCESSし、端末にメッセージが表示されます。setTarget:self も実行しようとしましたが、まったく役に立ちません。

これが私のコードです:applicationDidFinishLaunching

HomeWindowController *home_WindowController = [[[HomeWindowController alloc] initWithWindowNibName:@"HomeWindowController"] autorelease];<br/><br/> 
[[self window] addChildWindow:home_WindowController.window
                         ordered:NSWindowAbove];

そして HomeWindowController で:

- (id)initWithWindowNibName:(NSString *)windowNibName
{
     self = [super initWithWindowNibName:windowNibName];
    if (self) {
        // Initialization code here.

    }
    return self;
}

- (void)windowDidLoad
{
    [super windowDidLoad];
}

-(IBAction)action:(id)sender 
{
    NSLog(@"------------------ ");
}

ここで何が問題なのですか?NSButton を FileOwner とそのアクションにもバインドしています。通常は iOS for IB と同じです。をバインドしIBActionないと、 が取得されませんEXC_BAD_ACCESS

4

1 に答える 1

2

ようやく解決しました。メインウィンドウに追加した後、appDelegate メソッドで childWindowController を解放していました。しかし、解放できない理由がわかりません…</p>

あなたがウィンドウコントローラーを所有しており、ウィンドウコントローラーがそのウィンドウを所有しているためです。ウィンドウはコントローラーを維持していません。あなたは。そして、あなたがそうでないとき、それは、それをターゲットとするボタンなど、それと話したいと思うかもしれないものの下から消えます.

より一般的には、他のオブジェクトに対する所有権の責任を肩をすくめようとすること (たとえば、ウィンドウが自分の WC を所有することを期待すること) は、メモリ管理のバグを求めていることになります。

(私の唯一の例外は、コレクションを介して間接的にオブジェクトを所有することです。たとえば、モノでいっぱいの配列を所有している場合、出入りする途中で各モノを個別に保持および解放しません。それ以外は、私を裏切ることを期待しています。 .)

AppDelegate の childWindowController のローカル インスタンスであるため (上記で追加するためだけに)?

意味がわかりません。

于 2013-01-18T17:49:40.090 に答える