簡體   English   中英

我仍然需要在使用ARC的viewDidUnload中將IBOutlet屬性設置為null

[英]Do I still need to set IBOutlet properties to null in viewDidUnload with ARC

我還需要在使用ARC的viewDidUnload中將IBOutlet屬性設置為null嗎?

因為它仍然會生成以下注釋:

//釋放主視圖的所有保留子視圖。

那么nilling出口的主要目的是在視圖從視圖控制器卸載時,不會創建當子視圖沒有超級視圖時可能發生的僵屍,泄漏和奇怪的情況。

現在使用最新版本的Xcode,如果你在一個標題或私有聲明中拖動一個視圖元素,它會自動將Outlet設置為弱(目標iOS> = 5),並且在viewDidUnload方法中它將寫入[self setYourOutlet:nil]; 可能在這種情況下沒有必要,但這是一個很好的做法。 如果你的目標是較低的需要,因為你不能使用弱引用。 我建議總是使用,因為這是一個好習慣。

UPDATE

我想完成答案以避免誤解(僅談論iOS5)注意只有當主視圖的子視圖時,IB才會設置弱點。 通常,它發生在包含視圖控制器視圖的xib中。

有時可能會發生需要在運行時根據某些條件交換兩個視圖而無需以編程方式或在不同的xib中創建它們。 例如,您的主視圖由vc擁有,並且在同一個xib中,您創建了另外兩個視圖,在那一刻沒有超視圖。 如果您嘗試使用相同的技術連接它們,則創建的引用將很strong 在運行時,您現在可以交換視圖,只需在superview中添加或刪除,當然您應該在viewDidUnload中將它們取消。

我將在這里對安德烈的回答擴大(給予好評他!),因為答案是不是直線前進,除非你只意味着UI組件,在這種情況下,他們應該是弱。

IBOutlets是您定義它們的任何東西。 如果您使用:

@property (nonatomic, strong) IBOutlet UIView *someView;

在卸載父視圖/窗口時,您應該這樣做。

如果你這樣做:

@property (nonatomic, weak) IBOutlet __weak UIView *someView;

您不必將變量設為零,因為它將自動歸零。

你怎么樣都完全取決於你。 ARC之前我使用過:

[someView_ release], someView_ = nil;

現在您有兩個選擇:使用setter(使用@synthesize創建)或直接設置底層ivar。 結果是相同的 - 在這兩種情況下,對象的生命周期限定符都會注意到它的最終用途並將其釋放。

所以,繼續這樣做:

self.someView = nil

要么

@synthesize someView = someView_;
...
someView_ = nil;

對於標記為強大的IBOutlet,您仍然希望在viewDidUnload中將它們取出。

為什么:

當您收到內存不足通知時,當前未顯示的任何視圖可能會自行卸載(調用viewDidUnload)以節省內存。 通過縮小您的網點,您放棄了所有權並讓它們被釋放。 再次加載視圖時(再次顯示),將再次設置出口並調用viewDidLoad。

暫無
暫無

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

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