吐槽cocos2d-x内存管理缺陷
发布日期:2021-06-30 16:01:05 浏览次数:2 分类:技术文章

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

最近这个cocos2d-x项目临近结束,内存问题把大家搞得焦头烂额,个人觉得是cocos2d-x的问题。cocos2d-x源于cocos2d,借鉴了objc的“引用计数”内存管理方式,但人家是语言层上原生的,你在c++上山寨一下,问题当然很多,我这个水平一般的程序都能看出下述几点。
1. new,delete和retain(),release()之间混合使用,能编译通过,运行时可能出错,尤其是delete CCObject派生类对象时,混合使用必然带来混乱,人家objc就不一样了,对象都用alloc init方式初始化,限制严格,只要记住谁retain谁就负责release就好。
2. release函数不给力,objc对象收到release消息后,只要引用计数为零,dealloc必然调用,而cocos2d-x无语言层支持,release函数与objc的autorelease时机就类似了,这样,错误就会推迟出现,难以定位。
3. 引用计数管理干扰内存泄露工具,最近查内存泄露时候,发现n多定位到cocos2d-x上,很难判断是不是真的泄露。
4. cocos2d完全采用autorelease方式,还夸耀这点好,其实,一个有点经验的objc程序员就能搞懂retain和release的用法,你全用autorelease,结果又要自己retain一下,很无奈。
5. c++没有属性这东西,当成员变量需要长期持有一个对象时,需要手动retain,很危险。人家objc只要弄一个retain属性就ok了,自动,方便。
吐槽了这么多,再谈谈解决方案吧,牢记一点:CCObject的对象不要使用new和delete就ok了,每个类使用自己的static方法产生对象,当然,该方法里可以使用new。
似乎可以给类的每个CCObject类型成员变量加上访问方法,在那里retain,似乎能保险一些,但怎样限制类成员方法直接访问这些变量呢,难道要提供一个imp类,将这些变量都扔进去?没想好,以后慢慢试验。
至于内存泄露问题,没啥办法,cocos2d-x就这德行,除非他们自己提供内存泄露检查工具。我就纳闷了,当初为啥用c++呢,真的是效率高吗?

转载地址:https://kaitiren.blog.csdn.net/article/details/8614509 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:两分钟学会在GitHub托管代码
下一篇:Cocos2D 触摸分发原理

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月27日 07时32分09秒