1

OK奇怪的问题,这里有一个奇怪的情况我面对:与NSWindowController和ARC

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

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

现在,这里是什么:

  • 当ARC设置为NO时,该应用运行正常,窗口也显示正常。
  • 当我设置弧YES - 后我将它(和仅有1运行) - 它显示了一堆错误:

02月17日16时35分45秒DrKameleons,iMac.local MyApp的[16903]: kCGErrorIllegalArgument:_CGSFindSharedWindow:WID 2409年02月17个 16时35分45秒DrKameleons-iMac.local MyApp的[16903]:kCGErrorFailure: 设置断点@ CGErrorBreakpoint()捕获错误,因为它们是 记录。 02月17日16时35分45秒DrKameleons-iMac.local MyApp的[16903]: kCGErrorIllegalArgument:CGSOrderFrontConditionally:无效的窗口

,窗口不露面。

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

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


提示:

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

回答

5

当ARC是,本地控制器被释放在showWindow调用之后!但窗户被推迟,窗户甚至没有到那一步 - 即使是这样,这将是“无控制器的”
窗口不保留它的控制器:)仅反之亦然

解决方法是记住到控制器的参考直到你的appDelegate被释放/直到退出

@implementation AppDelegate { 
    myWindowController* _controller; 
} 

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

你的代码工作没有弧,因为没有释放控制器的发生,它只是漏了!虽然ARC确实添加了发布呼叫(因为它正确地看到控制器不再使用)

+0

好的。你是我的英雄。老实说。你无法想象有多少时间的联络你已经救了我。真。非常感谢,伙计! ;-) – 2013-02-17 15:33:06

+1

:D当我第一次使用ARC时,遇到了同样的问题。但现在我爱ARC :) – 2013-02-17 15:47:53

+0

嗯,这实际上是我第一次与ARC合作。事情是,我得到了ARC工作(最后),但不是最初的事情,让我寻求ARC的帮助...(http://stackoverflow.com/questions/14919248/objects-not-successfully-released-内存管理) – 2013-02-17 17:02:07