簡體   English   中英

iOS-GCD對自我的弱引用

[英]iOS - GCD weak and strong reference to self

GCD ,我一直在使用__weak引用self 每個人都建議。 我知道在GCD中對self (經過測試)的強烈引用不會產生保留周期。 Apple建議使用__weak引用self,然后使用__strong引用_week引用,以確保執行該塊時self不會nil

我有以下代碼:

- (IBAction)startGCD:(id)sender {

    GCDVC* __weak weakSelf = self;

    [self.activityIndicator startAnimating];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ // 1

        // VC2* __strong strongSelf = weakSelf;

        [weakSelf.proArray addObject:@"2"];

        [NSThread sleepForTimeInterval:10];

        NSLog(@"%@",weakSelf.proArray);

        dispatch_async(dispatch_get_main_queue(), ^{ // 2
            [weakSelf.activityIndicator stopAnimating];
        });
    });

}

測試1我按下按鈕,指示器旋轉。 我在GCD完成並且GCDViewController被釋放之前按下了返回按鈕。

測試2然后,我取消對自我的強烈引用,並執行相同的過程。 在塊完成工作之前,不會釋放GCDViewController。 但隨后被釋放。

測試3現在,如果我直接指代自我(沒有__weak__strong ),我在測試2 __strong具有確切的行為。

因此,如果我想確保在執行塊時self不會為nil,那么對__weak引用使用__strong引用對self何在? 我在這里想念什么嗎? 是否有任何示例會改變測試2和3的結果?

在GCD中的某個塊中時,我一直在使用__weak引用self。 每個人都建議。

不,我不知道有人建議這樣做。 在存在保留周期的某些情況下,弱引用是有意義的。 但是,一個塊應該捕獲對任何對象的弱引用還是強引用(包括一個self指向的對象),取決於所討論代碼的特定內存管理設計,並且

我知道在GCD中對自我(經過測試)的強烈引用不會產生保留周期。

在全局或主隊列上將一個塊傳遞給dispatch_async永遠不會產生保留周期。

現在,如果我直接指代自我(沒有__weak或__strong),我將具有測試2的確切行為。

在這種情況下,您可能看不到任何區別。 但是它們通常具有不同的行為。 基本上,您的問題是,捕獲對self指向的對象的強引用或弱引用的塊之間有什么區別?

不同之處在於,如果當前對象(由self指向的對象)已經被持有該對象強引用的所有其他對象(可能是該塊)釋放了,並且該塊隨后異步執行。

  • 如果該塊捕獲了對當前對象的強引用,則該引用將使對象在整個時間內保持活動狀態。 因此,該對象仍然存在,我們可以使用它並向其發送消息,等等。
  • 如果該塊捕獲了對當前對象的弱引用,則當釋放對它的最后一個強引用時,當前對象已經被釋放。 因此,該塊的弱引用此時將為nil ,並且該塊將不對其執行任何操作(它要么檢查strongSelf並在看到它為nil時返回,否則將向其發送消息到strongSelf nil ,什么都不做)。

因此,一種情況下完成了工作,而另一種情況下則什么也沒有做。

如果您當前的對象是某個UI元素(例如視圖或視圖控制器),則只要它在視圖層次結構中,它就會被視圖層次結構中的事物保留,因此您需要退出該視圖/視圖控制器,以便在沒有其他東西對其有強烈引用的情況下。

就您而言,您在塊內要做的只是[weakSelf.activityIndicator stopAnimating]; ,即更改UI。 該命令是否運行無關緊要,因為請記住,包含該命令的視圖已經停止顯示。 沒有人可以看到此活動指示器。 那么,如果不停止,有什么不同呢? 但這是特定於此情況的。 通常,您可以想象該塊中的命令會更改某些全局狀態,或者通過網絡或某些內容發送某些內容,如果您不這樣做,則兩者之間會有很大差異。

暫無
暫無

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

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