`
xumingrencai
  • 浏览: 1210708 次
文章分类
社区版块
存档分类
最新评论

可能造成“Received Memery Warning”的一种原因

 
阅读更多

我的游戏使用到了cocos2d 框架,游戏结构比较简单,一个 MenuScene, 一个 GameScene

GameScene继承自 CCLayer

由于要使用一个比较大的地形(总之比iTouch4g的屏幕要大)

因此我选择使用可以移动的场景用来实现这个功能

之前我的GameScene就是仅有的一个 CCLayer 对象~

但是如果要实现场景的移动的话,则必须要在这个CCLayer里面在添加一个 子 CCLayer 对象

将位置不用改变的小地图,joyStick,游戏暂停重来等按钮放在母层里面,

这样游戏场景在被移动的时候,这些位置不用改变的元素就不会随着游戏场景腾挪

然而,就在这个时候,问题出现了~

这个问题我也是偶然才发现的,之前游戏的持久性我都有过测试,“重来”一百次也不会有什么问题

说明在GameScene dealloc的时候将该干掉的都给干掉了,

但是在我增加子层了之后,我发现对于比较复杂的地图,重来不了两下游戏就会crash掉

查看控制台,发现爆出的错误就是 “Received Memery Warning”

除此之外,再没有其他的提示~

于是我求助Google大神,但是收效甚微

我一遍又一遍的重来,试图能够发现导致游戏崩溃的根本原因

在xcode4。2里面,我发现已经找不到Instruments的身影了

这也是在可以理解的范围,毕竟XCode从3个多G降到1个多G,不能不说被阉割掉了很多东西

我发现了一个比较有意思的功能,Analyze,快捷键是 Command + shift + b

Command +b是生成的快捷键,这是一个很常用的快捷键,对我来说仅次于 Command +r(编译并且在完成之后运行)了~

这个Analyze相当于对源代码进行处理,将有可能导致内存泄露的地方给报告出来~

不能说这个功能很鸡肋,因为我确实靠这个功能找到了几处没有delete的对内存分配

但是,也是仅此而已,我并没有靠着这个功能找到 Received Memery Warnning的原因~

如果用Cocos2d用的比较多的肯定都知道,凡继承自CCNode的类型在一定程度上如果作为Scene场景的成员节点

都是不用在Scene的 dealloc方法中自主去释放掉的,cocos2d会“很智能”的将这些子节点给清理掉~

离我的问题很近了!!就是因为cocos2d有点儿智能但是又不是智能到完美无缺,因此才导致了我所遇到的问题!!

这个也是我整了一个下午灵光一闪间突然想到的,我就像,母层的dealloc虽然是能将其下的所有子节点给清理掉了

但是,子层里面如果也是以容器的身份出现,里面也盛放了很多孙子节点,那么祖母节点不一定能将这些孙子辈们给干掉~

事实证明我的猜测不错,我先后试过这么一些方法:

1。将子层由CCLayer改成CCNode;(不管用,重来不到10次依然会内存耗尽崩溃)

2。在母层的dealloc方法中主动去调用子层的dealloc方法(重来的第一次就会报错,很明显,子层将会被dealloc两次,肯定会造成类似内存访问出错的错误)

3。我在母层的dealloc方法中,在 【super dealloc】之前添加子层removeAllChildrenWithCleanup:YES的代码

在第3种方法的实验过程中,我得到了满意的结果,即使重来100次,Received Memery Warning 的错误也不会再报出了~

那么,更加证明了我的推测:

Scene 的 dealloc 仅能智能地将所有的子辈节点给 dealloc 掉,

如果子辈中有充当容器身份的 CCLayer,是不能将其所包含的孙子辈继承自 CCNode 的对象智能清理掉的!!

用一句形象的话语来概括:山高皇帝远 ^ ^

PS:其实以前如果在Scene中添加其他类似容器这样的CCLayer的时候,都会新建一个类

在这个新建出来的类的dealloc方法中做好所有的清理工作

这样倒是不会有什么问题了,因为所谓的智能清理也不过就是调用所有子辈节点的dealloc方法

换句话说,如果子辈的dealloc方法没有给子辈自己擦好屁股以至于发生了内存泄露,母亲大人也是毫无办法的~


分享到:
评论

相关推荐

    memery controler

    DDR内存是一种高速同步动态随机访问存储器(SDRAM),它能在时钟周期的上升沿和下降沿同时传输数据,从而实现双倍的数据传输速率。内存控制器的主要任务包括地址管理、时序控制、数据缓冲以及错误检测与校正等。 1....

    memery-test.rar_Memery test_dos4gw_memerytest_内存DOS测试_内存测

    标题中的“memery-test.rar”是一个RAR压缩文件,通常用于打包和存储多个文件或文件夹。RAR是一种流行的压缩格式,可以提供比ZIP更好的压缩比,同时支持文件修复和密码保护等高级特性。在这个特定的上下文中,这个...

    Memory1_WordPress_memery_

    标题中的"Memory1_WordPress_memory_"可能是指一个与WordPress相关的主题或者插件,可能是为了优化WordPress站点的内存管理。在WordPress中,内存管理是至关重要的,因为它直接影响到网站的加载速度和性能。当我们...

    memery_pool.zip_内存池_内存池pool link_链表内存池

    内存池是一种优化内存分配策略的技术,它通过预先分配一大块连续的内存空间,并将这些内存划分成多个固定大小的小块,以供程序动态地分配和释放。标题中的"memery_pool.zip_内存池_内存池pool link_链表内存池"暗示...

    free memery pro

    "Free Memory Pro"是一款专注于内存优化的工具,旨在帮助用户提升设备性能,通过清理和管理设备的RAM(随机存取存储器),使手机或电脑运行更流畅。在了解这款应用之前,我们首先需要理解内存(内存)在计算机系统中...

    memery-legacy:memery 是一个用 Python 编写的容错 IRC 机器人。 它最初是由 nycz 创建的,用于破解内部笑话,但经过一些完整的重写,它已经演变成更多的笑话斜线实用程序。 这个版本急需某种重写。 (rewrite 正在 memeryleczair 中进行,但仍然有些支持使用。)

    memery 是非常动态的,几乎所有事情都可以在不丢失 IRC 连接的情况下完成。 对于管理,有几个可用的命令。 管理员命令 管理员命令只能由与 adminlist 配置文件中的任何正则表达式匹配的人执行(有关配置文件的部分中...

    memery:Ruby中用于记忆的瑰宝

    回忆录 Memery是用于记住方法返回值的Ruby gem。 Ruby中的常规记忆不需要任何宝石,看起来像这样: def user @user ||= User . find ( some_id )end 但是,如果计算结果可以为nil或false或该方法使用参数,则此方法...

    页面置换算法

    #include #include #include /*全局变量*/ int mSIZE;...static int memery[10]={0}; /*物理块中的页号*/ static int page[100]={0}; /*页面号引用串*/ static int temp[100][10]={0}; /*辅助数组*/

    What every programmer should know about memory

    7. **内存池**:内存池是一种优化内存分配的策略,通过预先分配一大块内存,然后从中按需分配小块内存。理解内存池的工作方式和应用场景,可以减少碎片并提高内存利用率。 8. **源码分析工具**:掌握如Valgrind、...

    请求页式存储管理中常用页面置换算法模拟

    FIFO 算法是一种简单的页面置换算法,它的基本思想是:当发生缺页时,从队头删除一页,而从队尾加入缺页。这种算法可以简单地实现,但是它不能保证页面置换的最优性。 在模拟实现中,我们使用队列存储内存中的页面...

    in-memory computing 内存内计算的一些论文.zip

    内存内计算(In-memory Computing)是一种新兴的计算范式,旨在通过将数据存储与计算单元融合在同一物理介质中,以显著提升计算机系统的处理速度和能效。这一技术尤其对人工智能(AI)领域的应用至关重要,因为它...

    Memory Management: What Every Driver Writer Needs to Know

    内存描述列表(MDL,Memory Descriptor List)是一种数据结构,用于描述一段物理内存的属性,如大小、位置等。MDL主要用于跨内核模式和用户模式的数据传输,特别是在DMA(Direct Memory Access)操作中非常有用。 #...

    多线程本机系统信息采集系统

    在IT领域,多线程本机系统信息采集系统是一种用于实时监控计算机硬件资源状态的工具。这个系统通过利用多线程技术,能够高效地并行处理数据采集任务,确保对CPU、磁盘(DISK)和内存(MEMERY)等关键资源的监控是...

    SmartARM3250开发板 串口工具

    Windows CE 6.0是一种实时操作系统(RTOS),是微软专门为小型设备和嵌入式系统设计的。它提供了核心操作系统服务,如进程管理、内存管理以及网络和设备驱动支持。在SmartARM3250开发板上运行WinCE 6.0,意味着...

    页面置换FIFO算法java

    页面置换FIFO算法是操作系统中的一种页面置换算法,用于解决内存分配和释放的问题。下面是该算法的详细介绍: 算法原理 FIFO(First-In-First-Out,先进先出)算法是最简单的一种页面置换算法。其基本思想是:当...

    Keil_uvision_4基本使用教程

    Keil µVision4是美国Keil公司推出的一款用于嵌入式系统的集成开发环境(IDE),它是专门针对ARM和8051微控制器的程序设计。Keil µVision4提供了完整的调试功能、丰富的库函数支持以及与硬件紧密集成的特性,是进行...

    NIOS开发遇到的error整理.docx

    第一次使用NIOS II时,可能会遇到SOPC Builder无法加载系统PTF的错误,解决方法是检查工程路径名称中是否包含非法字符,例如中文名称,解决方法是将路径名称改为不包含空格和中文的名称。 三、硬件debug错误 在...

    C/C++程序为例内存分布详解

    博客中提到的`elr-memery-pool`项目可能是一个内存池实现,它是一种优化内存分配策略的方式,通过预先分配一大块内存,然后从中切割小块内存供程序使用,从而减少频繁的系统调用,提高性能。`elr_mpl.c`和`elr_mtx.c...

Global site tag (gtag.js) - Google Analytics