[英]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.