簡體   English   中英

弧:將多個按鈕的引用設置為nil

[英]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將釋放當前對象的內存。 如果您未將它們設置nilARC認為您仍在使用它們,並且它們將位於內存中,並且會導致嚴重的內存泄漏。

更新#1

如果您對按鈕有任何參考,這是最簡單的方法,則無需將其設置為nil ,因為它們的superviewretain它們,您只需從其superview刪除即可。

for (UIView *_subView in self.view.subviews) {
    if ([_subView isKindOfClass:[UIButton class]]) {
        [_subView removeFromSuperview];
    }
}

如果要將指針存儲在其他任何地方(例如,在NSArray中),則也必須從指針中刪除指針。

暫無
暫無

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

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