使用YTKRequest避免控制器退出后不马上被释放的问题
来源:互联网 发布:python黑客攻防入门 编辑:程序博客网 时间:2024/06/14 08:43
我们项目中的网络请求基类SomeRequest是封装自YTKRequest的,然后各个API再继承自这个基类,在控制器里面调用API的时候典型是这样写的:
- (void)exeXXXApi{ xxxApi = [[XXXAPI alloc] initWithXXX]; [xxxApi startWithCompletionHandlerWithSuccess:^(__kindof ETopBaseRequest *_Nonnull request, id _Nonnull response) { }failure:^(__kindof ETopBaseRequest *_Nonnull request, NSInteger code, NSString *_Nonnull errorMsg) { }];}
并没有做任何别的处理。
这样的写法在有些情况下会造成控制器离开后,没有被释放。比如,网络很慢的情况,用户进入一个界面,开始执行一个api请求,然后,等了一会没看到请求数据,就返回退出界面。这时候,控制器的dealloc方法是不会走的,也就是控制器没有在退出后马上被释放,而是被api的success或failure的block引用着,等网络请求完成,调用完这这两个blocks之一后,才会走dealloc方法,释放控制器。这不是我们想要的结果,我们要在控制器退出离开后,就马上释放它。
既然,控制器是被api的blocks引用着才没有马上释放,那么在退出离开时要把这些blocks置为nil,它们就不会引用控制器了,也不会再被api请求完成后执行了。
针对YTKRequest的情况,具体做法分两步:
一,在控制器.m文件里面定义一个属性引用api对象。
@interface SomeController()@property (nonatomic, strong) SomeRequest *api;@end@implimentation SomeController- (void)exeXXXApi{ self.api = [[XXXAPI alloc] initWithXXX]; [self.api startWithCompletionHandlerWithSuccess:^(__kindof ETopBaseRequest *_Nonnull request, id _Nonnull response) { }failure:^(__kindof ETopBaseRequest *_Nonnull request, NSInteger code, NSString *_Nonnull errorMsg) { }];}@end
二,针对返回退出的情况,在控制器的viewWillDisappear方法里面调用YTKRequest的stop方法。
- (void)viewWillDisappear:(BOOL)animated{ // 导航后退离开界面 if (![[self.navigationController viewControllers] containsObject: self]) { // 离开界面调用这个方法,哪怕api的block与self之间有循环引用,也会释放self [self.api stop]; } [super viewWillDisappear:animated];}
测试证明,以上的写法保证了api无论有没有请求完成,在退出离开控制器时,控制器的dealloc方法都会被执行。
阅读全文
0 0
- 使用YTKRequest避免控制器退出后不马上被释放的问题
- 关于Android程序退出后内存释放的问题
- 关于Android程序退出后内存释放的问题
- EditText 键盘弹出后马上又退出问题
- 关于GDI资源使用后未释放,导致GDI对象猛增,程序花屏,异常退出的问题
- 使用hibernate数据库连接不释放的问题
- mongodb删除集合后磁盘空间不释放的问题
- UI不马上更新的问题
- 因WKWebview导致视图控制器释放不掉而内存崩溃的问题
- 因WKWebview导致视图控制器释放不掉而内存崩溃的问题
- shh框架使用链接池出现不释放的问题
- 关于tomcat启动后马上又自动关闭的问题
- 关于tomcat启动后马上又自动关闭的问题
- tomcat启动后马上又自动关闭的问题
- 分布式部署ResourceManager启动后马上关闭的问题
- 控制器在退出的时候不执行dealloc方法
- activity destory掉后马上释放内存方法
- iOS 控制器POP后dealloc方法不走,通知监听无法移除的问题
- 织梦dedecms文章列表页调用文章带链接TAG标签
- pycharm远程开发python程序
- 如何在controller接受json类型
- JVM内存结构浅析
- python
- 使用YTKRequest避免控制器退出后不马上被释放的问题
- 用DataOutputStream表示输出流
- andorid封装分页控件
- Linux 无法进行域名解析
- PHP使用SMTP发送邮件
- 程序员基础算法
- linux正则表达式 Ingeneral
- 【C#学习】静态字段、常量字段、只读字段、只读属性的相同点和不同点
- 成为java高级工程师需要什么