簡體   English   中英

發布網點的最佳和最安全的做法是什么?

[英]What's the best and safest practice for releasing outlets?

iOS文檔說明你的視圖控制器應該釋放(並且nil,因為這是良好的做法,實際上是2.x兼容性必須的)-dealloc中任何保留的出口。

文檔還說明,如果要在視圖不可見時發出清除並且發出內存警告,則應在-viewDidUnload中對其進行相同的操作。

我想知道兩件事:

  1. 這是否意味着我應該復制我的所有插座發布代碼? 把它全部放在-dealloc和-viewDidUnload中? 這是一個非常痛苦的維護,很容易忘記!
  2. 我保證在-viewDidUnload之后重新加載視圖時會重新填充所有的插件,包括我的筆尖中引用非視圖對象的插件嗎?

理想的答案回答了上述兩個問題,如果在-dealloc VS -viewDidUnload中最佳地釋放哪些屬性之間存在區別,則詳細闡明這一區別。

-viewDidUnload 嚴格用於釋放具有保留屬性的IBOutlet。

其原因與UIViewController具有它保留的view屬性的事實有關。 該視圖屬性本身保留對其所有子視圖的引用。 這些子視圖正是您在這些插座屬性中保留的內容。 問題在於這些子視圖對它們有“額外”保留。

-viewDidUnload的目標是清除不必要的內存使用量。 -viewDidUnload ,視圖屬性已經被釋放,它會釋放頂級UIView及其所有子視圖。 由於我們保留了其中一些子視圖,因此它們會留在內存中,我們希望釋放它們,因為它們將不再使用。 當(如果)重新加載視圖時,將創建這些子視圖的新副本。 屬性也設置為nil,嚴格來說我們沒有指向釋放內存的指針。

-dealloc ,應釋放所有保留的屬性和實例變量。 在剛剛執行-viewDidUnload的情況下,您將發送一個無害的[nil release]; 對於IBOutlet保留的屬性,您只需設置為nil。

添加到優秀的答案:

使用Apple LLVM 3.0編譯器(並啟用了ARC),-dealloc的需求消失了(或者至少需要釋放其中的插座),只留下-viewDidUnload來處理。 結果,不再有重復的代碼。

尼克完全回答了問題的第一部分,所以我馬上跳到第二部分。

確實你得到了保證! 當您的視圖從nib文件重新加載時,該nib文件上的所有內容都會重新加載。 沒有部分加載nib文件內容的方法,所以如果重新加載該nib,內部的所有內容也會重新加載。 但是從筆尖裝入的所有東西都有自動釋放。 所以你必須保留它們。 如果您有奧特萊斯保留這些新裝的課程,並且您將這些奧特萊斯作為筆記連接在筆尖上,那么您很高興。 在視圖控制器上,示例控制器本身是該nib的文件所有者,view是nib上的根元素,視圖由文件的所有者出口“view”保留,視圖本身保留所有其他子元素。 如果您有多個根元素或根視圖未保留的元素,那么您必須確保這些元素的出口在系統自動加載nib時保留它們,如果您通過方法加載nib,那么您必須知道所有這些類在到達您的代碼時會自動釋放。

簡單地說視圖也是類,當nib文件被加載時,其中的所有內容都被加載,而不是它的某些部分。 管理網點是您的責任。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM