簡體   English   中英

在ARC上將IBOutlets創建為ivars。 內存問題?

[英]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.

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