[英]“__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
如果我們通過self,則可能會在某些條件下導致保留周期(例如,某些對象可能強烈引用該塊,而self可能強烈引用該對象)。 將弱引用傳遞到塊中可確保沒有這種保留周期。 但是,在執行塊時,我們仍然可能需要保持自我活力。 這就是為什么我們將弱引用指定為強引用。
結論:將弱引用傳遞到塊中並將其關聯為強引用將在執行塊時保留對象,同時保證不會進行任何保留循環
weakSelf
的目的是確保通知中心觀察者不維護對AVCamViewController
的強引用。 塊中存在strongSelf
是為了避免出現競爭情況,在AVCamViewController
情況下, AVCamViewController
可能會在通知中間被重新分配(因此,如果在通知進入時存在weakSelf
,請在處理通知的整個過程中保持該狀態;但是如果weakSelf
在strongSelf
通知時不存在,那么strongSelf
也將為nil
)。
這個過程(有時被戲稱為“弱自強自舞”)至關重要。 如果您只有strongSelf = self
,那么您已經重新引入了強參考周期(以前稱為“保留周期”),因此上述模式很難解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.