1

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

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

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

现在是:

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

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

并且窗口不显示

现在,如果我尝试重新运行应用程序(不进行任何更改,ARC 仍处于打开状态),窗口仍然不会出现。但根本没有错误。:S

到底是怎么回事?关于如何解决这个问题(并使窗口出现)的任何想法?


提示:

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

1 回答 1

5

当 ARC 开启时,LOCAL 控制器在其 showWindow 调用后立即释放!但是由于窗口被推迟,窗口甚至还没有存在——即使是这样,它也将是“无控制器”
的,窗口不会保留它的控制器:) 反之亦然

解决方法是记住对控制器的引用直到您的 appDelegate 被释放/直到您退出

@implementation AppDelegate {
    myWindowController* _controller;
}

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

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

于 2013-02-17T15:16:37.673 回答