简单了解AFN(3.0版本)的block内不会对外界循环引用的原因

简单了解AFN(3.0版本)的block内不会对外界循环引用的原因

1.当我们使用AFHTTPSessionManager创建的单例对象调用GET..或POST..方法发送网络请求时,会先调用dataTaskWithHTTPMethod方法创建一个NSURLSessionDataTask类型的dataTask对象,然后执行resume方法启动任务。
2.dataTaskWithHTTPMethod 方法内部先调用requestWithMethod方法构建request请求,当构建请求失败时,会调用dataTaskWithRequest方法创建一个dataTask并返回,dataTaskWithRequest的completionHandler的block会对成功和失败进行回调

3.关键点在dataTaskWithRequest内部会创建一个NSURLSessionDataTask类型的dataTask,然后调用addDelegateForDataTask方法时将dataTask和completionHandler这个block传进去,最终dataTask和completionHandler被AFURLSessionManagerTaskDelegate代理对象引用,
而AFURLSessionManagerTaskDelegate被mutableTaskDelegatesKeyedByTaskIdentifier字典强引用,在completionHandler执行完后,mutableTaskDelegatesKeyedByTaskIdentifier字典会移除AFURLSessionManagerTaskDelegate对象,这样completionHandler也被释放了,所以外界在AFN的completionHandler中使用self等也不会产生循环引用。

Snip20161030_3.png
Snip20161030_5.png
Snip20161030_6.png
Snip20161030_4.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容