为什么要在 AFURLSessionManagerTaskDelegate 中使用 __weak __typeof__(task) weakTask = task?

Why use __weak __typeof__(task) weakTask = task in AFURLSessionManagerTaskDelegate?

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

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

使用 weak 任务。我知道下面的代码块将持有对任务的强引用,这意味着如果不使用弱任务,AFURLSessionManagerTaskDelegate 将强持有任务。
但是任务没有强hold住AFURLSessionManagerTaskDelegate,没有循环引用。
那么为什么一定要有弱任务呢?

你是对的,这里不太可能有任何强引用循环。但是考虑到块属性经常是意外强引用循环的来源,问题通常不是 "why use weak",而是 "do I need a strong reference?" 是的,使用弱引用有一些适度的开销,但它是一个很好的防御检查 object graph 并自问强引用是否为 needed/desired.

的编程技术

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