为什么在AFURLSessionManagerTaskDelegate中使用__weak __typeof __(任务)weakTask = task?

时间:2016-07-17 08:06:58

标签: ios afnetworking

我正在研究AFNetworking(3.0)源代码。 我注意到AFURLSessionManagerTaskDelegate的方法

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

使用weak任务。我知道下面的代码块将强有力地引用任务,这意味着AFURLSessionManagerTaskDelegate如果不使用弱任务,将强有力地执行任务。
但是任务没有强烈保持AFURLSessionManagerTaskDelegate,没有循环引用。
那为什么必须有一个弱任务?

1 个答案:

答案 0 :(得分:0)

你是对的,这里不太可能有任何强大的参考周期。但是考虑到块属性经常是偶然的强参考周期的来源,通常问题不是“为什么使用弱”,而是“我需要一个强大的参考?”是的,使用弱引用有一些适度的开销,但是检查object graph并询问自己是否需要/期望强引用是一种很好的防御性编程技术。

在这种情况下,如果任务完成,则进度块没有理由保持对任务的强引用。所以使用弱引用是完全合理的。