1

我正在构建一个 Mac 应用程序。我正在添加一个childWindowControllermainWindow. 在我childWindowController的 IB 中,我有几个按钮,它们的动作连接在 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 及其操作。通常与 IB 的 iOS 相同。当我不绑定时IBAction,我不会得到EXC_BAD_ACCESS

4

1 回答 1

2

终于解决了,我是在appDelegate方法上把childWindowController添加到主窗口后释放的。但是我不明白为什么不能释放它......</p>

因为你拥有窗口控制器,而窗口控制器拥有它的窗口。窗口没有保持其控制器处于活动状态;你是。当你不在的时候,它会在任何可能想要与之交谈的东西下消失,比如一个将它作为目标的按钮。

更一般地说,试图将你的所有权责任推给其他对象——例如,期望一个窗口为你拥有它的 WC——是在寻找内存管理错误。

(我唯一的例外是通过集合间接拥有对象:如果我拥有一个充满事物的数组,我不会在进出的过程中单独保留和释放每个事物。其他任何事情,我都希望比我聪明.)

因为它是 AppDelegate 上 childWindowController 的本地实例(仅用于在上面添加)?

我不明白你的意思。

于 2013-01-18T17:49:40.090 回答