NSWindowController和ARC的奇怪问题

时间:2013-02-17 14:43:33

标签: objective-c cocoa automatic-ref-counting nswindow nswindowcontroller

好的,这是我面临的一个奇怪的情况:

  • 我有一个NSWindowController子类,myMainWindow.xib中的一个窗口和AppDelegate.m调用NSWindowController这样的窗口:

    myWindowController* controller = [[myWindowController alloc] initWithWindowNibName:@"myMainWindow"];
    [controller showWindow:self];
    

现在就是:

  • 当ARC设置为NO时,应用程序运行良好,窗口也显示正常。
  • 当我将ARC设置为YES时 - 在我设置它之后立即(并且为了JUST 1运行) - 它显示了一堆错误:
  

Feb 17 16:35:45 DrKameleons-iMac.local MyApp [16903]:   kCGErrorIllegalArgument:_CGSFindSharedWindow:WID 2409 Feb 17   16:35:45 DrKameleons-iMac.local MyApp [16903]:kCGErrorFailure:   设置断点@ CGErrorBreakpoint()以捕获错误   登录。 2月17日16:35:45 DrKameleons-iMac.local MyApp [16903]:   kCGErrorIllegalArgument:CGSOrderFrontConditional:无效窗口

窗口出现。

现在,如果我尝试重新运行应用程序(不更改任何内容,ARC仍然打开),窗口仍然不会显示。但是根本没有错误。 :S

发生了什么事?关于如何解决这个问题的想法(并使窗口出现)?


提示:

  • 在Mac OS X 10.7.5上运行
  • Xcode版本:4.5.1

1 个答案:

答案 0 :(得分:5)

当ARC打开时,LOCAL控制器在showWindow调用后立即释放!但是随着窗户被推迟,窗户甚至还没有 - 甚至它是,它将是'无控制器' 窗口不保留其控制器:)反之亦然

修复是记住对控制器的引用直到你的appDelegate被释放/直到你退出

@implementation AppDelegate {
    myWindowController* _controller;
}

...
_controller = [[myWindowController alloc] initWithWindowNibName:@"myMainWindow"];
[_controller showWindow:self];

你的代码在没有弧的情况下工作,因为没有控制器的释放发生它只是泄漏! ARC确实添加了一个发布调用(因为它正确地看到控制器不再使用)