簡體   English   中英

使用myWeakClass相對於使用self的“ __weak MyClass * myWeakClass = self”

[英]“__weak MyClass *myWeakClass = self” using myWeakClass VS using self

我正在嘗試學習AVFoundation示例代碼“ AVCam”。 在示例代碼項目AVCamViewController.m類中,有一個類似的實現

__weak AVCamViewController *weakSelf = self;
[self setRuntimeErrorHandlingObserver:[[NSNotificationCenter defaultCenter] addObserverForName:AVCaptureSessionRuntimeErrorNotification
                                                                                            object:[self session]
                                                                                             queue:nil
                                                                                        usingBlock:^(NSNotification *note) {
AVCamViewController *strongSelf = weakSelf;

我的問題是為什么我們要先聲明一個__weak指針,然后再將此弱指針分配給* strongSelf。 如果我們直接分配“自我”會有什么區別
就像是:

AVCamViewController *strongSelf = self

整個代碼https://developer.apple.com/library/prerelease/ios/samplecode/AVCam/Listings/AVCam_AVCamViewController_m.html

如果我們通過self,則可能會在某些條件下導致保留周期(例如,某些對象可能強烈引用該塊,而self可能強烈引用該對象)。 將弱引用傳遞到塊中可確保沒有這種保留周期。 但是,在執行塊時,我們仍然可能需要保持自我活力。 這就是為什么我們將弱引用指定為強引用。

結論:將弱引用傳遞到塊中並將其關聯為強引用將在執行塊時保留對象,同時保證不會進行任何保留循環

weakSelf的目的是確保通知中心觀察者不維護對AVCamViewController的強引用。 塊中存在strongSelf是為了避免出現競爭情況,在AVCamViewController情況下, AVCamViewController可能會在通知中間被重新分配(因此,如果在通知進入時存在weakSelf ,請在處理通知的整個過程中保持該狀態;但是如果weakSelfstrongSelf通知時不存在,那么strongSelf也將為nil )。

這個過程(有時被戲稱為“弱自強自舞”)至關重要。 如果您只有strongSelf = self ,那么您已經重新引入了強參考周期(以前稱為“保留周期”),因此上述模式很難解決。

暫無
暫無

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

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