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