使用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 ...
随机推荐
- powerpoint2015如何调整PPT立体图形
在powerpoint2016中,可以添加图片来丰富演说,但通常人们只会懂得插入平面图片.动态图片,立体图片就无法插入了吗?不是的,在powerpoint2016为我们准备了大量的预设,可以调整图片, ...
- iOS的REST服务-备
REST式的服务最重要的三个特征就是**无状态性**(statelessness).**统一资源定位**(uniform resource identification)和**可缓存性**(cache ...
- <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalabl ...
- javascript book
我们很欣喜地看到,在设计模式领域,<JavaScript设计模式>(JavaScript Design Patterns)和<JavaScript编程模式>(JavaScrip ...
- MySQL全连接(Full Join)实现,union和union all用法
MySQL本身不支持你所说的full join(全连接),但可以通过union来实现 ,下面是一个简单测试,可以看看: mysql> CREATE TABLE a(id int,name cha ...
- 【中国剩余定理】【容斥原理】【快速乘法】【数论】HDU 5768 Lucky7
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5768 题目大意: T组数据,求L~R中满足:1.是7的倍数,2.对n个素数有 %pi!=ai 的数 ...
- vs2010旗舰版产品密钥
Microsoft Visual Studio 2010(VS2010)正式版 CDKEY / SN: YCFHQ-9DWCY-DKV88-T2TMH-G7BHP 企业版.旗舰版都适用
- Minimum Path Sum——LeetCode
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- JavaScript之原型深入详解
理解原型 原型是一个对象,其他对象可以通过它实现属性继承.任何一个对象都可以成为继承,所有对象在默认的情况下都有一个原型,因为原型本身也是对象,所以每个原型自身又有一个原型.任何一个对象都有一个pro ...
- hp-ux-ia64:jffi/ffi 编译总结
在HP-UX-IA64下编译JFFI及FFI遇到很多问题,官网jffi文档中也并没有在hp-ux-ia64平台上有编译过. 次文档仅为记录之用.记录编译过程,但并不意味着本人遇到的问题已经解决. 注意 ...