2013-03-01 49 views
2

我開始編寫我們的iPhone應用程序的第二個版本,並試圖整理以前的錯誤(因爲這是我第一次嘗試Objective-C)。我的問題與「UIViewController被銷燬時我需要做的事情」有關,似乎存在一些矛盾的答案,我想確保我理解正確。當我需要銷燬UIViewControllers時,我應該如何整理它

夫婦的約束:

  1. 此代碼是用於與iOS 5和iOS 6設備
  2. 我不想註冊,因爲UIViewControllers需要接收通知註銷的viewWillAppear中和viewWillDisappear NSNotifications即使它們不能被用戶看到。
  3. 我使用的是StoryBoard而不是單獨的nib文件。

因此,考慮到上述限制條件,下列說法是否正確?

  1. IBOutlets故事板連接到UIViewControllers應該是弱,強引用會在幕後創建。
  2. 因爲IBOutlets弱我不應該需要零出來在低內存情況
  3. 我不應該使用viewDidUnload,因爲它是被棄用,而不是我應該使用didReceiveMemoryWarning。在這種情況下,我只需要刪除很強的屬性(可以重新計算)
  4. 可以在viewDidLoad上註冊NSNotifications。
  5. 因爲我希望在隱藏視圖時繼續接收通知,所以取消註冊視圖的最佳位置是dealloc,在didReceiveMemoryWarning中註銷它們也沒有好處。

感謝您的幫助,

故事板連接到UIViewControllers

回答

4

IBOutlets應該是弱,強引用會在幕後創建。

號NSKeyedUnarchiver(NSCoder)不變化與用戶創建的出口相關聯的存儲限定符。由於你沒有明確地分配和初始化IBOutlets,所以你不要讓它們變得虛弱,因此在可可意義上你不會「擁有」它們。

因爲IBOutlets弱我不應該需要零出來在低內存情況

根本不符合事實。清零弱引用在dealloc中爲零,而不是在低內存情況下。 Apple希望通過明確發佈強大的渠道來處理內存警告。

我不應該使用viewDidUnload,因爲它是被棄用,而不是我應該使用didReceiveMemoryWarning。在這種情況下,我只需要刪除很強的屬性(可以重新計算)

是的,但是對於替換-viewDidUnload,dealloc可以達到這個目的。

在viewDidLoad上註冊NSNotifications是可以接受的。 因爲我希望在隱藏視圖時繼續接收通知,所以註銷它們的最佳位置是dealloc,在didReceiveMemoryWarning中註銷它們也沒有好處。

絕對。

+0

感謝您的回覆,對您對第2點的回覆感到好奇。我不認爲我需要刪除弱引用,因爲它們不會保留關聯的對象。我假定一旦一個對象失去了它的所有強大的引用,它就會被銷燬。 – 2013-03-01 14:34:05

+0

對不起,除此之外,如果我在低內存情況下將我的弱IBOutlets清零,我將如何獲取對UI對象的引用? – 2013-03-01 14:35:23

+1

事實上,我不同意這一點。沒有任何微弱的參考不會釋放任何記憶。 – DaGaMs 2013-03-01 14:37:55

1

我相信你說的是正確的。關於IBOutlets和強/弱參考,請參閱this thread

至於通知:在didReceiveMemoryWarning中註銷它們似乎毫無意義,因爲它們本身並不是在註銷時自己釋放任何內存。因此,您在取消分配時註銷它們是正確的。

相關問題