簡體   English   中英

ARC下-viewDidUnload中的弱屬性和強屬性

[英]Weak and strong properties in -viewDidUnload under ARC

我是iPhone開發的新手。 我在項目中使用ARC。 據我了解使用ARC,我們不必手動釋放任何對象。 但是,我觀察到在某些地方,即使在使用ARC之后,人們也會在ViewDidUnload中將對象明確設置為nil。

例如,在.h文件中,我有類似以下內容:

@property (unsafe_unretained, nonatomic) IBOutlet MKMapView *mapViewOutlet;
@property (unsafe_unretained, nonatomic) IBOutlet UIToolbar *toolBar;
@property (strong,nonatomic) NSMutableArray *dataArray;

和.m如下:

- (void)viewDidUnload
{
     [self setMapViewOutlet:nil];
     [self setToolBar:nil];
     [super viewDidUnload];
     self.dataArray=nil;
}

我的問題是,即使在ARC下,是否真的有必要在ViewDidUnload中顯式指定nil?

viewDidUnload方法的全部目的是釋放不需要的數據,以釋放內存。 閱讀文檔

當發生內存不足的情況並且不需要當前視圖控制器的視圖時,系統可能會選擇從內存中刪除這些視圖。 釋放視圖控制器的視圖之后,將調用此方法,這是您執行任何最終清理的機會。 如果視圖控制器存儲對視圖或其子視圖的單獨引用,則應使用此方法釋放這些引用。 您也可以使用此方法刪除對您創建的支持視圖的所有對象的引用,但是由於視圖已消失,因此不再需要這些對象。 您不應使用此方法來釋放用戶數據或任何其他不易重新創建的信息。

所以你設置屬性,以nil 現在為了釋放對象和幫助系統釋放一些內存。 但這當然取決於屬性類型-強屬性是“您的”,只有您可以決定是否立即釋放它們(通過設置為nil )。 弱屬性可能已經為nil ,例如,如果它們指向與主視圖一起釋放的某些視圖,則該屬性為nil unsafe_unretained屬性是一種特殊的野獸。 它們指向的對象可能已經釋放,但這並不意味着它們會自動設置為nil 因此,您應該使用一種“較安全”的屬性類型(強/弱),或者在此處將不安全的屬性設置為nil ,以確保以后不再使用已發布的對象。 在這種情況下,沒有硬性規定,您必須考慮情況及其對各種屬性的含義。

順便說一句, viewDidUnload在iOS 6中已被棄用,在低內存條件下不再釋放任何視圖。 您仍然會收到didReceiveMemoryWarning回調,因此,您可以根據需要釋放一些資源。 再次,我建議您閱讀文檔並進行一些測試,以了解會發生什么並決定應該做什么。

ARC將僅釋放不持有對對象的強引用的屬性。 在您的情況下,這些都是強引用,因此除非明確將它們設置為nil,否則將保留它們。

viewDidUnload方法並不意味着您的UIViewController已從內存中刪除,而只是意味着其視圖已從內存中刪除( iOS開發人員-ViewController lifecycle )。

在這種情況下,除非顯式設置為nil,否則UIViewController仍保留在內存中,因此也保留在其屬性中。

使用unsafe_unretained時,應將其分配給nil,因為它不會隱式分配給nil,在弱引用的情況下,它將隱式分配給nil,因此為了避免任何懸空引用,您需要將其分配給nil如果是unsafe_unretained。

暫無
暫無

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

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