Mike
Mike

Reputation: 1219

EXC_BAD_ACCESS when NSButton is pressed on NSWindowController

I am building a Mac application. I am adding a childWindowController to mainWindow. In my childWindowController, I have several buttons with their actions connected in IB. But when I press the NSButton, the application crashes and I get EXC_BAD_ACCESS message in the terminal. I also tried to perform setTarget:self, but that doesn't help at all.

Here's my code: applicationDidFinishLaunching

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

And in the 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(@"------------------ ");
}

What is wrong here? I am binding the NSButton to FileOwner and its action as well. Normally same as for iOS for IB. When I don't bind the IBAction, I don't get EXC_BAD_ACCESS.

Upvotes: 1

Views: 877

Answers (1)

Peter Hosey
Peter Hosey

Reputation: 96373

It finally got resolved, I was releasing the childWindowController on appDelegate method after adding it on main window.But I dont understand why cant I release it …

Because you own the window controller, and the window controller owns its window. The window isn't keeping its controller alive; you are. And when you're not, it dies out from under anything that might want to talk to it, such as a button that has it as its target.

More generally, trying to shrug off your ownership responsibilities onto other objects—e.g., expecting a window to own its WC for you—is asking for memory-management bugs.

(My only exception to that is indirectly owning objects through collections: if I own, say, an array full of Things, I don't retain and release each Thing individually on its way in and out. Anything else, I expect to outsmart me.)

since it is a local instance of childWindowController on AppDelegate (just for adding it above)?

I don't understand what you meant by that.

Upvotes: 2

Related Questions