performSelector延时调用导致的内存泄露

 
转载:http://blog.csdn.net/wangqiuyun/article/details/7587929

前几天在给游戏做收尾测试时,发现了一个关于内存泄露的问题,一直没找着问题所在,经过反复调试和查找资料今天终于解决了,特此记录下来以免以后再犯!

关于objective-c的内存管理,我们都知道一个原则就是“谁创建,谁释放”,换句话说,不是我们创建的,就不用我们去释放。但是实际上objective-c的内存管理远远没那么简单,我的情况是这样的:

我在debug模式下面用CCLOG在dealloc函数里面输出一些信息,目的就是要检查场景的dealloc方法在replaceScene的时候有没有被调用,按照子龙山人大哥的说法,如果场景切换的时候dealloc没有调用,说明你这个场景的内存有问题。有可能被某个对象retain了,其retainCount在replaceScene的时候没有减少到0,所以dealloc方法是不会调用的。如果dealloc方法都没有调掉,那么这其实就是一种内存泄露。我在检查时,发现一个场景死活不调用dealloc,最后恨不得把所有的游戏逻辑都移除了,还是不走dealloc。

最后的最后才发现实际上是performSelector延时调用的问题,经查找资料,performSelector关于内存管理的执行原理是这样的执行 [self performSelector:@selector(method1:) withObject:self.tableLayer afterDelay:3]; 的时候,系统会将tableLayer的引用计数加1,执行完这个方法时,还会将tableLayer的引用计数减1,而在我的游戏里这个延时执行函数是被多次调用的,有时切换场景时延时函数已经被调用但还没有执行,这时tableLayer的引用计数没有减少到0,也就导致了切换场景dealloc方法没有被调用,出现了内存泄露。

所以最后我的解决办法就是取消那些还没有来得及执行的延时函数,代码很简单:

[NSObject cancelPreviousPerformRequestsWithTarget:self]

当然你也可以一个一个得这样用:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(method1:) object:nil]

加上了这个以后,切换场景也就很顺利地执行了dealloc方法,至此问题解决!

最后在找资料时也发现了,延时调用实现长按钮的实现思路,记录下来以备后用:

在touchBegan里面

[self performSelector:@selector(longPressMethod:) withObject:nil afterDelay:longPressTime]

然后在end 或cancel里做判断,如果时间不够长按的时间调用:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(longPressMethod:) object:nil]

取消began里的方法

最后最后总结:

performSelector是一个很有用的函数,跟它打过不少交道,经过血与泪的教训,总结一下它的使用如下:

使用前先检测一下,

SEL testSelector = @selector(test:);

if([tester respondsToSelector:testSelector])

{

//如果响应就执行

[tester test:@"invoke test method"];

}

使用后,如果有必要,需要显示的调用cancelPreviousPerformRequestsWithTarget:selector:object: ,否则有可能产生内存泄露,而且这种内存泄露很难发现,因为它并不违反任何规则,所以一定要注意!

转载于:https://www.cnblogs.com/huangzizhu/p/3697142.html

【转】performSelector延时调用导致的内存泄露相关推荐

  1. .NET 6 在 Win7 系统证书链错误导致 HttpWebRequest 内存泄露

    本文记录我将应用迁移到 dotnet 6 之后,在 Win7 系统上,因为使用 HttpWebRequest 访问一个本地服务,此本地服务开启 https 且证书链在此 Win7 系统上错误,导致应用 ...

  2. 会不会导致内存泄漏_可能会导致.NET内存泄露的8种行为

    原文连接:https://michaelscodingspot.com/ways-to-cause-memory-leaks-in-dotnet/ 作者 Michael Shpilt.授权翻译,转载请 ...

  3. c#调用ShowDialog方法内存泄露

    ShowDialog内存泄露问题 ShowDialog ShowDialog 显示窗口有show和ShowDialog方法 调用ShowDialog方法显示窗口, 除非手动关闭,否则程序永远不执行Sh ...

  4. 【Java报错】记录一次 sun.misc.Unsafe.park(Native Method) Conflicting setter definitions for property 导致的内存泄露

    1. 报错信息 2021-10-29 08:44:56 WARN [,,,] [main] o.a.c.loader.WebappClassLoaderBase - The web applicati ...

  5. [h5棋牌项目]-05-重载配置导致的内存泄露

    vector的内存释放  https://www.cnblogs.com/summerRQ/articles/2407974.html

  6. 避免使用CreateThread函数,导致的内存泄露

    原文链接:http://blog.csdn.net/solosure/article/details/6262877 转载于:https://www.cnblogs.com/MrYuan/p/5220 ...

  7. 使用ThreadLocal不当可能会导致内存泄露

    使用ThreadLocal不当可能会导致内存泄露 基础篇已经讲解了ThreadLocal的原理,本节着重来讲解下使用ThreadLocal会导致内存泄露的原因,并讲解使用ThreadLocal导致内存 ...

  8. inputstreamreader未关闭会导致oom_ThreadLocal 一定会导致内存泄露?

    在面试的时候,ThreadLocal作为高并发常用工具经常会被问到.而面试官比较喜欢问的问题有以下两个: 1.ThreadLocal是怎么实现来保证每个线程的变量副本的. 2.ThreadLocal的 ...

  9. android的内存泄露有几种,Android中几种有可能会导致内存泄露的情况

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.Static静态成员导致的内存泄露 将占用大量内存空间的变量声明为static静态类型.当Activity被销毁的时 ...

  10. android弹出输入法内存,android 输入法导致内存泄露问题

    该方法侵入太高,必须重新EditText,如果我们直接使用一个第三方的控件包含了EditText,那么这么做就没有意义,所以放弃了这种方案,然后我又想出了其他方案,Android 输入法导致内存泄露以 ...

最新文章

  1. 网络推广中网络推广专员如何培养与搜索引擎的友好度和信任度
  2. Python Django 事务管理
  3. 连州技工学校学计算机要交多少学费,技校学费一年大约需要多少
  4. 异常通知(After Throwing Advice)
  5. getsockname与getpeername用法与区别
  6. 03. 数组中重复的数字
  7. 组件的生命周期钩子函数
  8. oracle怎么按时间查找,JDBC:我如何在Oracle中按时间查询?
  9. UnauthorizedAccessException Invaild cross-thread access
  10. Spring 的定时任务--Quartz
  11. 【TransE模型】基于分布式表示推理
  12. Jensen不等式/琴生不等式的证明 数学归纳法
  13. pc登录2个微信客户端
  14. 转行开始的前端填坑之路
  15. macOS SwiftUI 指示器组件规范之 02 评级指标 Rating Indicators
  16. 360点睛销售开放平台-身份认证-java版
  17. 如何在Google表格中使用QUERY函数
  18. S曲线加减速算法 VS 梯形加减速算法
  19. 李文胜oracle,2014年下期解放学校防火演练方案.doc
  20. 性能优化案例之:如何将TPS从60提升到2000?

热门文章

  1. 学习笔记:中国大学MOOC《计算机程序设计C++》第3周单元测试
  2. 二进制方式部署k8s集群1.21版本-域名形式
  3. 「mt4软件」均线指标的应用方法
  4. WIN10 下 autocad2006 及其他版本打开文件多窗口不能一个窗口的解决办法
  5. 企业常见10个CRM问题答疑!
  6. 新西兰留学再移民,哪些专业好就业?
  7. 标准盒子模型和IE盒子模型
  8. net proxy FortiGate 200A / SANGFOR / Blue Coat
  9. fastadmin 多表关联查询
  10. 无人机DLG生产作业流程