NSWindowController和ARC的奇怪问题

Dr.*_*eon 1 cocoa objective-c nswindow nswindowcontroller automatic-ref-counting

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

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

    myWindowController* controller = [[myWindowController alloc] initWithWindowNibName:@"myMainWindow"];
    [controller showWindow:self];
    
    Run Code Online (Sandbox Code Playgroud)

现在这是什么:

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

2月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

Dai*_*jan 5

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

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

@implementation AppDelegate {
    myWindowController* _controller;
}

...
_controller = [[myWindowController alloc] initWithWindowNibName:@"myMainWindow"];
[_controller showWindow:self];
Run Code Online (Sandbox Code Playgroud)

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