使用AFNetworking时, 控制器点击返回销毁了, 但还是会执行请求成功或失败的block, 导致野指针异常
原本我以为是我程序框架有问题...后来才知道, 无知真可怕...
__unsafe_unretained __block typeof(self) weakSelf = self;
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil];
manager.requestSerializer.timeoutInterval = 30;
[manager POST:URLString parameters:params constructingBodyWithBlock:block progress:uploadProgress success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (responseObject) {
// 操作固定数据
[weakSelf operationWithSessionId:responseObject[@"sessionid"]
userInfo:responseObject[@"userInfo"]
shopCartNum:responseObject[@"shopcartnum"]
secret:responseObject[@"secret"]];
success(task, responseObject);
} else {
[SVProgressHUD dismiss];
RPLog(@"请求的链接有问题");
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failure(task, error);
}];
大家都知道, 在block里面使用self会形成循环引用, 所以我这里就使用__unsafe_unretained __block typeof(self) weakSelf = self; 来避免,
但是在每次发出请求后(请求结果还没有返回时), 我点导航栏上的返回, 就会出现野指针异常...我就纳闷了...控制器也有被销毁呀...为什么还会调用请求完成后的block呢?
也就是说, 控制器太早被销毁了...所以导致请求完后的block访问了野指针...
后来自己瞎搞了一个方法, 方法如下:
出现这个问题, 是因为控制器太早销毁..那么我就在block里面使用self而不是weakSelf, 让block对self进行一个强引用, 然后等请求完成后的block销毁, 控制器才会销毁..
但这样做的弊端就是会导致内存泄露, 虽然我在测试的时候, 请求发送出去, 点返回, 请求完成, 控制器也随之销毁...我猜可能是AFNetworking这框架对请求完成后的block的生命周期有做一些优化..
注意, 我说是我猜的!!我也不知道是不是这样...
虽然暂时解决了问题...但是内心还是很难受...因为总感觉哪里不对劲...所以就有了第二种解决方法...
就是__unsafe_unretained __block typeof(self) weakSelf = self;换成__weak typeof(self) weakSelf = self; 问题就解决了!!!
然后我网上找了下这两者的区别..
具体可以看看这里~~~
http://www.it165.net/pro/html/201410/24001.html
使用AFNetworking时, 控制器点击返回销毁了, 但还是会执行请求成功或失败的block, 导致野指针异常的更多相关文章
- 请求时控制器的返回结果view()怎么会默认调到某个页面的?
请求时控制器的返回结果view()怎么会默认调到某个页面的? (1)请求时会拿方法行为的名字去和视图的名字对应,会默认去views视图下的与控制器名称一样的文件夹下名字与方法对应的视图文件匹配对应,然 ...
- 点击回退时需要点击2次才可返回js
为a加上window.location.href跳转页面时,再返回到此页面,再点击返回时需点击2次才能返回到前一个页面,原因竟然是href=“#”的原因,在html中#可做为锚点 http://blo ...
- 按钮显示PopupWindow,setOutsideTouchable(true)时,点击按钮再次打开的问题
先给大家看看这个:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%9F%A5%E8%AF%86%E5%BA%93/21462.shtml ...
- 解决在 使用 AjaxFileUploder 插件时,不能获取返回的 json 结果数据
在MVC 项目 中使用 AjaxFileUploader 这个插件时,在上传图片或文件时,在控制器中返回的是 json数据,可是在 ie,或 googleChrome 浏览器中却出现 返回的json ...
- 关于android app两次点击返回键退出的处理
现在的android app在开发时,引入了两次点击返回键退出app的设计 为了避免用户误触,这个设计很人性化 中文网上社区有些同学贴了一些实现的例子,我觉得不是很好 代码如下 public bool ...
- Android 中点击返回键弹出“在按一次退出程序”的做法
在很多应用中都有这种做法,连续点击两次才退出程序,目的是为了防止用户不小心点击到了返回键而退出程序了,添加了一次用户确认的过程. 其实做法很简单,只需要做一个延时的消息处理就可以了. 首先在我们在一个 ...
- vue点击返回顶部插件vue-totop
vue-totop vue 点击返回顶部插件,可以根据参数设定按钮大小,颜色,类型,返回顶部的时间等.github地址:https://github.com/1006008051/vue-totop, ...
- 跨平台移动开发_PhoneGap 再次点击返回键切换到桌面效果
PhoneGap 再次点击返回键切换到桌面效果 相关代码 <!DOCTYPE html> <html> <head> <title> PhoneGap ...
- jQuery-点击返回顶部
在页面上,有时需要点击某个图标钮实现返回顶部的效果. 实现方式如下,给图标按钮增加名叫goTop-hook的类. // 点击返回顶部 $(window).scroll(function() { if ...
随机推荐
- ASP.NET MVC的Action Filter
一年前写了一篇短文ASP.NET MVC Action Filters,整理了Action Filter方面的资源,本篇文章详细的描述Action Filter.Action Filter作为一个可以 ...
- codeforces567E. President and Roads
题目大意:总统要回家,会经过一些街道,每条街道都是单向的并且拥有权值.现在,为了让总统更好的回家,要对每一条街道进行操作:1)如果该街道一定在最短路上,则输出“YES”.2)如果该街道修理过后,该边所 ...
- 反射-b
Class pkClass=NSClassFromString(@"PKAddPassesViewController"); if (pkClass) { NS ...
- Hadoop 学习笔记(二) HDFS API
4.删除HDFS上的文件 package proj; import java.io.IOException; import org.apache.hadoop.conf.Configuration; ...
- 深度学习“引擎”之争:GPU加速还是专属神经网络芯片?
深度学习“引擎”之争:GPU加速还是专属神经网络芯片? 深度学习(Deep Learning)在这两年风靡全球,大数据和高性能计算平台的推动作用功不可没,可谓深度学习的“燃料”和“引擎”,GPU则是引 ...
- ChatCell
import UIKit let chatCellHeight: CGFloat = 72 let chatCellInsetLeft = chatCellHeight + 8 class Chat ...
- 尽历磨难,搞定OPEN VSWITCH安装
参考贴: http://sudomakeinstall.com/linux-systems/installing-openvswitch-on-centos-6-6-5 yum install ker ...
- 龙杰ACR122S NFC读卡器
龙杰智能卡有限公司(ACS,龙杰智能卡控股有限公司之全资附属公司,香港联交所上市编号:8210)创立于1995年,是亚太地区第一大.全球三大智能卡读写器供应商之一.ACS被<福布斯亚洲>杂 ...
- Keil C51中变量的使用
引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额.在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功.由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用 ...
- JNA入门实例
JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C.C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so[shar ...