为什么要在 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.
的编程技术
在这种情况下,如果任务已完成,则进度块没有理由保持对该任务的强引用。所以使用弱引用是完全合理的。
我正在研究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.
的编程技术在这种情况下,如果任务已完成,则进度块没有理由保持对该任务的强引用。所以使用弱引用是完全合理的。