[英]Arc: Setting references to nil, for multiple buttons
當在ViewController中顯示諸如按鈕之類的項目時,我在頭文件中聲明了它:
@property (nonatomic, strong) UIButton *startButton;
在實現文件中將其合成:
@synthesize startButton;
在實現文件中啟動它:
startButton = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
並在viewDidUnload中將引用設置為nil:
[self setStartButton:nil];
但是, 如果我有60個列出的項 (在UIScrollView中)是在viewDidLoad(由Core Data饋送)中循環動態創建的,該怎么辦? (不使用TableView,因為項目非常復雜且具有交互性。)
我應該先在任何地方聲明物品嗎? 我應該在任何地方將它們設置為零嗎? (還是我應該保持雙手交叉並向聖弧祈禱?)
一些指導將不勝感激。 謝謝。
您的視圖控制器是否具有指向這60項中的每一項的屬性或實例變量?
是:然后在您的-viewDidUnload
中將這些ivars或屬性設置為nil。
否:沒什么好擔心的。
ARC改變了您管理內存的工作方式,但是並沒有改變基本原理,即每個對象都應照顧好自己對其他對象的引用,而不用擔心別人的引用。
在這種情況下,包含所有這些項目的視圖將具有對這些項目的強引用(通過其子視圖數組)。 當視圖控制器釋放其視圖時,該視圖將被釋放並釋放該過程中的所有子視圖。 因此,所有這些物品都將得到處理。 如果您確實對這些項目中的任何一個都有很強的引用,則這些引用將防止釋放被引用的對象-將引用設置為nil可以避免這種情況。
如果要動態創建這些視圖並將其添加為scrollView的子視圖,則無需執行其他任何操作。
在-viewDidUnload期間釋放-viewDidUnload
,它將正確清理其所有子視圖。
更新資料
這樣想吧。 在情節提要上的普通視圖設置中,不需要為每個視圖都具有屬性,只需與控制器進行交互的視圖即可。 這基本上是同一件事。 您有一堆嵌入到超級視圖中的視圖。 如果控制器不與它們交互,那么您不必擔心它們。
沒有。 :)
使用ARC
時, 您肯定會將all指針設置為 nil
,不再需要了 。
當沒有更多的strong
指針試圖使該對象保持活動狀態時, ARC
將釋放當前對象的內存。 如果您未將它們設置nil
則ARC
認為您仍在使用它們,並且它們將位於內存中,並且會導致嚴重的內存泄漏。
更新#1
如果您對按鈕有任何參考,這是最簡單的方法,則無需將其設置為nil
,因為它們的superview
類retain
它們,您只需從其superview
刪除即可。
for (UIView *_subView in self.view.subviews) {
if ([_subView isKindOfClass:[UIButton class]]) {
[_subView removeFromSuperview];
}
}
如果要將指針存儲在其他任何地方(例如,在NSArray
中),則也必須從指針中刪除指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.