我正在研究AFNetworking
(3.0)源代码。
我注意到AFURLSessionManagerTaskDelegate
的方法
- (void)setupProgressForTask:(NSURLSessionTask *)task {
__weak __typeof__(task) weakTask = task;
...}
使用weak
任务。我知道下面的代码块将强有力地引用任务,这意味着AFURLSessionManagerTaskDelegate
如果不使用弱任务,将强有力地执行任务。
但是任务没有强烈保持AFURLSessionManagerTaskDelegate
,没有循环引用。
那为什么必须有一个弱任务?
答案 0 :(得分:0)
你是对的,这里不太可能有任何强大的参考周期。但是考虑到块属性经常是偶然的强参考周期的来源,通常问题不是“为什么使用弱”,而是“我需要一个强大的参考?”是的,使用弱引用有一些适度的开销,但是检查object graph并询问自己是否需要/期望强引用是一种很好的防御性编程技术。
在这种情况下,如果任务完成,则进度块没有理由保持对任务的强引用。所以使用弱引用是完全合理的。