热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cocos2dx之retain和release

1.关于cocos2d-x中的内存管理机制,有很多关于这方面的资料,本不想提起,但笔者这段时间练的一个消灭星星的游戏实现却遇到了相关的问题

1.关于cocos2d-x中的内存管理机制,有很多关于这方面的资料,本不想提起,但笔者这段时间练的一个消灭星星的游戏实现却遇到了相关的问题,简单介绍一下。用于管理点击遍历搜索后的星星对象的vector在取出对象后遇到了问题,取出的行列值出现了混乱,百思不得其解,后来发现这时候取出的sprite对象其实已经被销毁了,所以在加入vector时retain后解决了问题,但其实问题却不在于此。


2.具体原因其实也很简单,消灭星星对象时必须先清空表示星星数组中的标志位,然后才能removechild,否则自然找不到对象了,直接上代码。很明显是相当不合理,只要把第一句放到最后就好了。现在看来确实简单,不过当时查错的过程还是很麻烦的,一直没有注意到这一点。当然了体会自己发现问题,解决问题的过程是很享受的,特别是最后解决后的成就感。扯远了,总之一点点的进步,就能慢慢养成好的习惯,

这里写图片描述


3.还有一点,cocos2d-x中Vector也封装了对于对象的 retain 操作和 release 操作,因此对对象的生命周期有了很大影响,这也是大多数人所忽略的的地方,可以在源码中找到解释。

这里写图片描述
这里写图片描述


4.由此可见,这里的vector已经同c++中不同了,作了进一步的封装,push_back会自动间接调用retain,而最后调用clear清除数组导致引用减少,自然导致了对象销毁。


5.因此笔者专门查阅了相关引用计数相关的资料,其实sprite在创建之初就autorelease 过了,就会被内存管理机制盯上了,可以在源码处找到证明。

这里写图片描述


6.继承自 Cocos2d-x 的Object的子类都具有内存管理的一套方法,当需要继续持有对象时,就要及时调用retain增加引用计数,避免对象被销毁程序崩溃的尴尬。当然对于不需要的对象调用release减少计数。值得一提的是,调用addchild具有retain同样的效果,在对象被人认领之后当然就不会被销毁了,显而易见,其原理无非就是间接调用了retain。


7.总而言之,当遇到程序意外崩溃,中断后发现内存中对象数据很不正常的时候多半是对象被销毁了。此时注意调用retain的时机,保证对象在运行需要的期间正常存在,就能解决此类问题。


推荐阅读
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文主要对比了Proxy和Object.defineProperty两种对象属性操作方式的优劣,并介绍了它们各自的应用场景。Proxy具有直接监听对象和数组变化、多种拦截方法以及新标准的性能优势等特点,而Object.defineProperty则兼容性好,支持IE9,并且无法用polyfill磨平浏览器兼容性问题。根据具体需求和浏览器兼容性考虑,选择合适的方式进行对象属性操作。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • Excel数据处理中的七个查询匹配函数详解
    本文介绍了Excel数据处理中的七个查询匹配函数,以vlookup函数为例进行了详细讲解。通过示例和语法解释,说明了vlookup函数的用法和参数的含义,帮助读者更好地理解和运用查询匹配函数进行数据处理。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
author-avatar
手机用户2502861125
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有