博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存泄露
阅读量:6859 次
发布时间:2019-06-26

本文共 2597 字,大约阅读时间需要 8 分钟。

  • 在检查项目内存泄露的时候遇到的一个问题记录下: 在webViewController里打开一个新的webViewController的时候报了内存泄露,代码如下:
-(void)registPushByWeb {    [_bridge registerHandler:@"openPage" handler:^(id data, WVJBResponseCallback responseCallback) {        NSString *url = [data objectForKey:@"data"];        NSInteger type = [[data objectForKey:@"type"] integerValue];        if (type == 1) {            NSString *fullpath = [NSString stringWithFormat:@"%@?type=%ld", url, (long)type];            [KZWRouterHelper pushbyURL:fullpath navgtionBarHidden:NO navigationTitle:nil isNeedBack:NO];        }    }];}复制代码

代码的意思利用jsbridge注册一个openPage方法打开一个webViewController,其实就是在打开一个自己因为自己就是webViewController,可能有点绕,意思就是这个意思。 看了半天也觉得没问题啊,然后看了下页面的代码,发现如下:

-(void)registRenewalSuccess {    [_bridge registerHandler:@"renewalSuccess" handler:^(id data, WVJBResponseCallback responseCallback) {        [self.navigationController popToRootViewControllerAnimated:YES];        responseCallback(@"success");    }];}复制代码

发现问题了,self,然后我改成如下:

-(void)registRenewalSuccess {     @WeakObj(self);    [_bridge registerHandler:@"renewalSuccess" handler:^(id data, WVJBResponseCallback responseCallback) {         @StrongObj(self);        [self.navigationController popToRootViewControllerAnimated:YES];        responseCallback(@"success");    }];}复制代码
  • 问题是解决了,但是报了一个错“invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_RunCalledWithInvalidMode to debug. This message will only appear once per execution. libc++abi.dylib: terminate_handler unexpectedly threw an exception”开始一脸懵逼啊。这什么情况,不加weakself就没问题。 正常流程走,我去搜了下这个错,但是并没有解决我的问题啊,什么可变数组add问题,还是一脸懵逼啊。后来灵感来了想到了这里:
[self.webView addObserver:self                   forKeyPath:NSStringFromSelector(@selector(estimatedProgress))                      options:0                      context:nil];[self.webView addObserver:self                forKeyPath:NSStringFromSelector(@selector(title))                   options:NSKeyValueObservingOptionNew context:NULL];复制代码

这里不就是add嘛,然后看这里:

-(void)dealloc {    self.webView.UIDelegate = nil;    [self.webView stopLoading];    [self.webView removeObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress))];}复制代码

很清晰的title的观察没有清,改成如下:

-(void)dealloc {    self.webView.UIDelegate = nil;    [self.webView stopLoading];    [self.webView removeObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress))];    [self.webView removeObserver:self forKeyPath:NSStringFromSelector(@selector(title))];}复制代码

好了,反思,在内存这块要比较关注Observer这个东西,然后就是block还是要时刻记得weakself和一些常见的内存泄露坑。 参考:https://www.zybuluo.com/MicroCai/note/67734

转载地址:http://knxyl.baihongyu.com/

你可能感兴趣的文章
JVM系列二:GC策略&内存申请、对象衰老
查看>>
MySQL 数据库备份策略:全备与增量备份
查看>>
Springboot的热部署
查看>>
Thinking in UML-1-为什么需要UML
查看>>
vs编译obj给delphi用
查看>>
过游戏保护NP或TP的几种方法和思路
查看>>
equals和hashcode为什么要一起重写
查看>>
模态与非模态对话框的问题
查看>>
httpclient 备注 控制连接时间及多线程错误
查看>>
地对地导弹地对地导弹地对地导弹
查看>>
浏览器根对象window之performance
查看>>
让div 充满整个body
查看>>
常用排序算法
查看>>
程序员保持快乐活跃的6个好习惯(转)
查看>>
找工作的一些感悟——前端小菜的成长
查看>>
jSON Call can throw but it is not marked with try
查看>>
基于bootstrap的jQuery多级列表树插件 treeview
查看>>
node06
查看>>
笔试题[转]
查看>>
图片轮换
查看>>