[英]Creating IBOutlets as ivars on ARC. Memory issues?
我知道,Objective-C開發的最佳實踐表明IBOutlets應該始終被Apple定義為屬性。
從實際的角度來看,在iOS和OS X中,出口應定義為已聲明的屬性。 出口通常應該較弱,但從文件所有者到筆尖文件(或iOS中的情節提要場景)中頂級對象的出口則應較堅固。
但是出於學習目的,我們使用ARC獲得了以下方案:
#import <UIKit/UIKit.h>
@interface DetailViewController : UIViewController{
IBOutlet UIButton *buttonA;
IBOutlet UIButton *buttonB;
IBOutlet UIButton *buttonC;
}
@end
如果我沒記錯的話,那三個按鈕很堅固,所以我的問題是:一旦釋放ViewController,這些按鈕是否會從內存中釋放出來?
我知道,如果這些按鈕較弱,它們會自動釋放,但不確定它們是否較強。
誰能幫忙嗎? 請注意,DetailViewController上的方法'dealloc'為空。
您詢問:
如果我沒記錯的話,那三個按鈕很
strong
,所以我的問題是:釋放ViewController后,這些按鈕會從內存中釋放嗎?
是。 或者,更准確地說,當沒有更強的引用時,這些按鈕將被釋放。 在這種情況下,這些按鈕現在具有兩個strong
引用,一個是視圖控制器,另一個是將這些按鈕添加為子視圖的視圖。 在釋放按鈕之前,都需要釋放這兩個strong
引用。
但是,為什么要保持對該控件的兩個強烈引用呢? 通常,讓視圖維護對其子視圖的strong
引用(即,讓視圖“擁有”其子視圖),並且視圖控制器僅對這些子視圖使用weak
引用。
我知道,如果這些按鈕
weak
,它們會自動釋放,但是不確定它們是否strong
。
當視圖控制器具有weak
引用時,按鈕將被釋放,因為對該按鈕的唯一strong
引用是由其父視圖維護的,並且當刪除該視圖時,該按鈕將失去其最后的強引用並可以被釋放。
如果視圖控制器具有strong
引用,則不必要地添加了另一個strong
引用,在釋放按鈕之前需要釋放該strong
引用。 您可以這樣做,但這不是必需的。 您引用了《 資源編程指南》中的內容 ,但前面的句子說:“您不需要對圖下方的對象的強引用,因為它們是其父級擁有的,因此應將創建強引用周期的風險降到最低。”
最重要的是,您的示例具有對IBOutlet
控件的隱式strong
引用。 但是,讓視圖控制器保持對按鈕的strong
引用沒有任何好處,這表示對對象圖有些誤解。 實際上,視圖控制器只應在其視圖上維護對控件的weak
引用。
是的,當釋放ViewController時,甚至會釋放其強烈引用的對象。 (當然,除非其他一些未發布的對象對此有很強的引用。)
這里對弱和強進行了很好的討論: iOS5中強和弱存儲的說明
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.