4

我有一個關於界面生成器和ARC的有趣問題。我正在構建一個將用xib初始化的視圖控制器。我使用界面生成器的tap-and-drag功能爲我的xib創建必要的屬性出口。這將財產視爲(弱,非原子)。聽起來對我很好。ARC和界面生成器

什麼扔我送行的是,線,如[self setCategoryButton:nil];被自動添加到viewDidUnload。我理解並使用ARC之前。但是,由於這些引用很弱,在視圖卸載時不會自動清除它們嗎?

我想我可以看到,如果這些意見被其他物體保持零-ING這些屬性值,但似乎不尋常的情況下,我......只是想獲得點進一步反饋。

感謝,

庫爾特

回答

4

我申請的錯誤在這一段時間回來,我得到的答覆是,這是故意行爲。由於Xcode無法驗證是否沒有其他強烈的視圖引用,因此實際上不能保證弱指針會在-viewDidUnload中自動清除。因此,他們爲你清除它。

個人而言,我認爲這是一個蹩腳的理由,但這就是給出的原因。

0

由於屬性是weak,在你的對象的引用不會影響對象的保留計數。所以是的,將對象設置爲零是沒有意義的。至少我是這麼理解的。

3

它只會在iOS5中被設爲零或更高版本(iOS 4的不會自動無弱指針),所以它是有安全自動生成的代碼。我一直在想這個,這是我能想出來的唯一原因。

+0

如果您的部署目標包含iOS 4,那麼您將無法使用弱指針;他們將成爲'unsafe_unretained'。 – 2012-03-19 23:20:06

+0

好點。爲了真正填補這個問題而做的不錯,而不是讓它像我一樣模糊地打擾你。 – jrturton 2012-03-20 08:03:47

3

從文檔中,viewDidUnload

  • 「這種方法......是你執行任何最終清理的機會。......」
  • 「當內存不足的情況發生,並且當前視圖控制器不需要的觀點,該系統可以選擇從內存中刪除這些意見」

從文檔,約弱(Setter方法語義)

  • 指定與目標對象之間存在弱(非擁有)關係。 如果目標對象被釋放,屬性值自動設置爲零

所以這是顯而易見的。它遵守規則。 是不是關於你的財產指向的對象,而只是基於上面的弱規則而使你的財產無效。

viewDidUnload假設您的弱屬性不能指向任何對象,因爲該對象已被釋放(基於View Controller的生命週期中viewDidUnload的位置)。只需用零來清理它。

它的安全爲您,明確到弱規則和內存使用效率。 編譯器無法確定您是否關注了尖銳的對象。 他只需要確保清理。