2016-07-17 22 views
1

我正在研究AFNetworking(3.0)源代碼。 我注意到在AFURLSessionManagerTaskDelegate的方法爲什麼在AFURLSessionManagerTaskDelegate中使用__weak __typeof __(task)weakTask = task?

- (void)setupProgressForTask:(NSURLSessionTask *)task { 
     __weak __typeof__(task) weakTask = task; 
    ...} 

使用weak任務。我知道下面的代碼塊會持有任務的強烈參考,這意味着如果不使用弱任務,AFURLSessionManagerTaskDelegate將強有力地保留任務。
但是這個任務沒有堅守住AFURLSessionManagerTaskDelegate,沒有循環引用。
那麼爲什麼必須有一個薄弱的任務?

回答

0

你是對的,在這裏不太可能有強大的參考週期。但是鑑於塊屬性是偶然強參考週期的來源,通常問題不是「爲什麼使用弱」,而是「我需要強大的參考?」。是的,使用弱引用有一些適度的開銷,但是它是一種很好的防禦性編程技術,用於檢查object graph並詢問自己是否需要/強制引用。

在這種情況下,如果任務完成,沒有理由讓進度塊保持強烈的任務參考。所以使用弱引用是完全合理的。

相關問題