简单了解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等也不会产生循环引用。