2012-12-17 36 views
1

我正在開發一個小而簡單的狀態菜單應用程序。
有一個菜單,當用戶點擊它時,應該出現一個HUD窗口(NSPanel)。 這是我的顯示板:如何避免在用戶關閉時釋放NSPanel

[hudWindow makeKeyAndOrderFront: self]; 

這是我如何關閉該窗口:

[hudWindow orderOut: nil]; 

所以這是事件鏈:

  1. 當應用程序啓動時我解僱窗口;
  2. 然後用戶(即我:-))點擊菜單項並使面板出現;
  3. 然後我點擊x並關閉面板;
  4. 然後我再次點擊菜單項,窗口不再出現。

它不會再出現,可能是因爲它被取消分配,並且我放了一個弱存儲器,否則使用__unsafe_unretained它會在第二次啓動時崩潰。
所以我猜如果有一種方法可以避免用戶點擊時釋放窗口。
我嘗試過強大的存儲空間,但在第二次啓動時發生這種情況,我無法再關閉它,這是一個問題。
有許多菜單狀態應用程序能夠顯示一個窗口,而用戶不會「殺死」它,我會做出類似的東西。

+3

您是否取消選中了IB中的「關閉時釋放」複選框(或者在代碼中完成了等效功能)?默認情況下,該框被選中用於面板。 – rdelmar

+0

這樣做,仍然要澄清爲什麼強壯它不起作用。 –

+0

可能是因爲releasedWhenClosed設置覆蓋了該設置。有一個強指針就意味着保留計數至少爲1,但這並不妨礙系統明確向面板發送釋放消息。 – rdelmar

回答

2

您應該取消選中IB中的「關閉時釋放」複選框(或在代碼中完成等效項)。默認情況下,該框被選中用於面板。

使用強指針可能不起作用,因爲releasedWhenClosed設置會覆蓋該指針。有一個強指針就意味着保留計數至少爲1,但這並不妨礙系統明確向面板發送釋放消息。

+2

此外,「關閉時釋放」設置與所有權不同。這個設置的作用是釋放你的所有權給你。如果您使用ARC,則無法表示會發生這種情況 - ARC將始終釋放您的所有權,無視NSWindow可能或不打算執行的操作 - 因此您應該關閉「關閉時釋放」。 (另一方面,如果你直接從一個筆尖加載窗口,你應該使用* on *來取消隱含的保留。請參閱參考資料編程指南瞭解更多信息。) –

0

難道你不能只是改變你的財產從弱到強?

+0

我所看到的只是「我放了一個弱存儲器,否則帶着__unsafe_unretained它會在第二次啓動時崩潰」 - 這是你的意思嗎?這並不能解釋爲什麼你不能把它變得強大。 – paulmelnikow

+0

第四行:「我嘗試過強大的存儲空間,但在第二次啓動時我無法再關閉它,這是一個問題。」如果我這樣做,我無法關閉面板。可能窗口是直接釋放而不是釋放的? –

+0

如果您使用的是ARC,則需要將該屬性設置爲較強以避免釋放窗口。您可以嘗試在窗口上調用'-performClose:',而不是'-orderOut:'。 – paulmelnikow

相關問題