2016-07-17 4 views
1

Ich studiere die AFNetworking (3.0) Quellcodes. Ich stelle fest, dass Verfahren in AFURLSessionManagerTaskDelegate ‚sWarum __weak __typeof __ (Aufgabe) weakTask = Aufgabe in AFURLSessionManagerTaskDelegate?

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

die weak Task verwendet. Ich weiß, dass der untere Codeblock einen starken Bezug auf die Aufgabe haben wird, das bedeutet AFURLSessionManagerTaskDelegate wird stark halten Aufgabe, wenn nicht schwache Aufgabe verwenden.
Aber die Aufgabe nicht stark halten AFURLSessionManagerTaskDelegate, gibt es keine Zirkelreferenz.
Warum also muss eine schwache Aufgabe sein?

Antwort

0

Es ist richtig, dass es hier keinen starken Referenzzyklus gibt. Aber wenn man bedenkt, wie oft Blockeigenschaften Quellen für zufällige starke Referenzzyklen sind, lautet die Frage oft nicht "warum sollte man schwach sein", sondern "brauche ich eine starke Referenz?" Ja, es gibt einen bescheidenen Overhead für die Verwendung von schwachen Referenzen, aber es ist eine gute defensive Programmiertechnik, um die object graph zu untersuchen und sich zu fragen, ob eine starke Referenz benötigt/gewünscht wird.

In diesem Fall gibt es keinen Grund, dass die Fortschrittsblöcke einen starken Verweis auf die Aufgabe beibehalten, wenn die Aufgabe abgeschlossen ist. Es ist also durchaus sinnvoll, schwache Referenz zu verwenden.

Verwandte Themen