我發現在這個問題上的文檔不清楚:如果您有IBOutlet,但不是屬性,是否保留?
假設你正在使用iOS(不是Mac的情況下,不需要提及差異)。說它嚴格是4.0+(不需要提到舊操作系統的差異)。假設我們正在自動加載NIB。
假設你有一個UIViewController,BigView。假設NIB文件中有十幾個所謂的「頂級」項目......可以是自定義控件,圖像或其他任何東西。
假設您確定要在應用程序運行期間多次顯式創建並擺脫BigView。所以:
對於在NIB這些頂級項目之一,有三種可能性:
(1)您沒有任何形式IBOutlet中的它,在所有。
(2)您確實有連接的IBOutlet - 但不是屬性。 (3)您確實有一個關聯的IBOutlet屬性(爲了避免混淆,我們會說一個retain屬性)。
那麼發佈BigView時該項目會發生什麼?
在(3)的情況下,您顯然必須明確釋放。如果你不這樣做,它會在視圖消失後停下來。沒問題。
在(1)的情況下,我認爲(但誰能真正確認?),當BigView消失的項目將被釋放。
在目前還不清楚會發生什麼(2)的情況下.......
在著名的參考鏈接展望:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html這是非常可疑:
「在iOS中,nib加載代碼使用setValue:forKey:方法來重新連接每個插座。該方法類似地尋找適當的存取器方法,[因此,如果沒有其他人?告訴我們APPLE ...]回退在其他方式,當失敗... [GOOD GRIEF!]「
並檢查出這個文檔:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html,向下滾動到「筆尖的對象保留」
所以......
「在筆尖文件對象與爲1的保留計數創建,然後自動釋放」神奇..
但等待!閱讀上幾句......
然而,...它使用現有的setter方法或默認保留的對象,如果沒有setter方法可用
他們在談論什麼?
他們是否意味着,如果沒有二傳手可用(伊娃,但無屬性),它是AGAIN未分配利潤(比「保留」之外,他們只提前款)---或者,他們是隻是重複自己,即「默認保留對象」與他們之前剛剛討論的「保留」相同(「保留計數爲1,然後自動釋放」)。
他們爲什麼會甚至提及自動釋放,如果這不是發生了什麼?
事實上 - 如果有人真的特別知道這個問題的答案...... 你怎麼知道?!?你問過DTS,還是通過測試,或者?我建議,關鍵文件(剛剛粘貼)是積極的不清楚。
再次 - 如果您有IBOutlet,,但不是屬性,連接到「頂級」對象。您是否負責釋放它?它保留了嗎?在那種情況下?
對於這個問題....只是在情況(1)是絕對的情況下,當BigView消失的啄將被釋放?我肯定會認爲是這樣,但誰知道呢?
的問題是,如果你使用一個IBOutlet實例變量會發生什麼,而不是一個屬性...
我傻傻從來沒有想過這個前/假設太多,沒有任何人有決定性的答案嗎?乾杯!!
爲了記錄我做了一個測試項目。
事實上(令我驚訝的是)僅僅將IB元件連接到IBOutlet的行爲顯然增加了一個保留。
(我只能從僞劣實況認爲,在這種情況下你得到明確:保留,自動釋放,保留 - 導致一個權衡利弊保留)
所以,這就是答案。
我會發布演示項目。我也指示任何讀者約拿的答案,下面完美地解釋了setValue的行爲:forKey:乾杯
非常感謝。我想知道完全相同的問題!閱讀蘋果文檔後,我感到非常困惑,所以我完全不確定要相信什麼。同時也感謝約拿對此的澄清。 – Buju 2012-01-24 15:30:26
這是一個奇怪的 - 我同意你的觀點。因爲那個人給了我「超級權力」或這個網站上的東西,因此贊成投票!我是世界之王! – Fattie 2012-01-28 12:14:18