cocos2d 内存管理

-- 不要怕,勇敢的迈出第一步,加油!!!!!--

此章介绍cocos2d 中的内存管理

1. cocos2d 中的所有Node类都继承于Ref,Ref中有引用计数的概念,如下:

class TestRef  : public Ref {

public:

TestRef() {}

virtual ~TestRef() {}

};

new TestRef -- 这时class Ref 中的_referenceCount = 1

retain -- _referenceCount++

release -- _referenceCount--, 如果_referenceCount == 0, 析构这个class

autoRelease -- 把this 放入PoolManager 内存池中. 当PoolManager回收时,就会把这个class回收到,并且析构。

例子1

auto p = new TestRef();   _referenceCount = 1

p->retain();       _referenceCount = 2

p->release();  _referenceCount = 1

p->release(); _referenceCount = 0, 析构p

例子2

auto p = new TestRef();   _referenceCount = 1

p->autoRelease();   当PoolManager回收时,就会把这个class回收到,并且析构。

这个就是cocos2d 中的内存管理。

如果我们在使用一些sprite,layer,scene时,在addChild的前后,如果不是特殊需要,不要调用其retain或者release,因为在创建后,这个组件都调用了autoRelease,并在其父节点释放后,其子节点都会释放的。

2. 不要在组件的继承类中保存如何的非Node类的成员变量,什么意思呢?如下,这里只是简单的描述一下哈,

class TestLayer : public layer {

public:

virtual ~TestLayer() {

t->release();

}

CREATE_FUNC(Fight);

private:

TestRef *t;

};

bool TestLayer::init() {

if (!Layer::init())

return false;

t = new TestRef();

return true;

}

把当前的TestLayer加入Scene中,然后程序退出,Scene和TestLayer都会被析构掉。在TestLayer的析构中,我们要把TestRef也析构掉,但是在TestLayer的析构函数断点中,我看到 t 是一个无效的指针,并且TestRef的析构函数没有被调用过,“内存泄露”了,怀疑如下:仅供个人参考,如果有人知道具体答案,请告知,谢谢~~~~

在TestLayer析构之前,其内部的所有子组件都会被析构掉,并且其所有成员变量都被重置成野指针,这是什么原因,我还没有搞清楚,内存泄露,程序退出时就会挂掉,大家可以根据这个,判断其是否内存泄露,什么地方内存泄露,还是很有用的。

结论:

1. cocos2d 的内存管理有效的解决某些童鞋忘掉释放内存的习惯,当然这个习惯不好哈。

2. 不能在组件的继承类中保存任何成员变量的对象,谨记。

时间: 2024-10-12 07:47:14

cocos2d 内存管理的相关文章

cocos2d 内存管理机制

简单做下笔记,等有更深的理解时再补充. Cocos2d内存管理的基本原理是对象内存引用计数.当声明定义一个对象时,会在堆上为这个对象分配内存,并且有一个变量m_uReference专门用于记录该对象被引用了多少次. 内存引用计数的原理就是,当该对象被引用时m_uReference++,当该对象被取消引用时m_uReference--,若果m_uReference==0时,该对象就会被释放. 有了基本概念后,就不得不提及两个重要的函数--retain()和release().这两个函数是干什么用的

cocos2d内存管理

设想如下场景, 这是一个典型的内存合理分配的场景: 在一帧内, 有若干个函数, 每个函数都会创建一系列的精灵, 每个精灵都不同, 都会占用一定的内存, 精灵的总数可能会有1000个, 而一个函数只会创建10个精灵这样, 创建的精灵只会在这个函数中使用, 大致代码如下: for(int i = 0; i < 10; i++) { Sprite* s = Sprite::create(); //-- doSomething -- } 这样做会造成内存泄露吗? 答案是当然不会, 但是这样会造成一帧内的

Cocos2d之&ldquo;引用计数&rdquo;内存管理机制实现解析

一.引言 本文主要分析cocos2d游戏开发引擎的引用计数内存管理技术的实现原理.建议读者在阅读本文之前阅读笔者之前一篇介绍如何使用cocos2d内存管理技术的文章--<Cocos2d之Ref类与内存管理使用详解>. 二.相关概念 引用计数 引用计数是计算机编程语言的一种内存管理技术,是指将资源(对象.内存或者磁盘空间等)的被引用计数保存起来,当引用计数变为零时就将资源释放的过程.使用引用计数技术可以实现自动内存管理的目的. 当实例化一个类时,对象的引用计数为1,在其他对象需要持有这个对象时,

Cocos2d之Ref类与内存管理使用详解

一.简介 用C++和JAVA编写过程序的朋友一定会为两种语言不同的内存管理机制懊恼.JAVA程序运行在JVM之上,由JVM自动实现内存管理,开发者只管申请内存而不用手动释放内存.当JAVA中对象没有被任何引用变量(类似于C和C++的指针)引用时,JVM会将对象释放掉.C++和C一样,是编译后能够直接被操作系统执行的语言,没有虚拟机负责其内存管理,因此需要在程序中管理内存.本文主要介绍如何使用cocos2d提供的内存管理机制. Cocos2d-x借鉴了“引用计数”思想,实现了一定程度上的自动内存管

cocos2dx[3.2](24)——内存管理机制

[参考] http://zh.wikipedia.org/wiki/引用计数 (引用计数--维基百科) http://cn.cocos2d-x.org/tutorial/show?id=2300 (引用计数和自动释放池) http://cn.cocos2d-x.org/tutorial/show?id=1331 (内存管理--绕不过去的坎) http://blog.csdn.net/legendof1991/article/details/23360131 (内存优化) https://gith

cocos2dx内存管理

cocos2dx基于引用计数管理内存,所有继承自CCObject的对象都将获得引用计数的能力,可通过调用retain成员函数用于引用计数值,调用release减少引用计数值,当计数值减为0时销毁对象. cocos2dx的对象管理是树形结构的,可通过调用父亲节点的addChild成员函数将一个子节点对象添加到父节点中,当子节点被添加到父亲节点中,子节点的引用计数值加1,如果通过removeChild将子节点从父节点中移除子节点的引用计数值减1.当父节点被销毁时,会遍历其所有的子节点,将其子节点的引

cocos2d-x 源码分析 : Ref (CCObject) 源码分析 cocos2d-x内存管理策略

源码版本来自3.x,转载请注明 cocos2d-x 源码分析总目录: http://blog.csdn.net/u011225840/article/details/31743129 1.Ref,AutoreleasePool,PoolManager Ref中包含了一个叫referenceCount的引用计数,当一个Ref类的变量被new的时候,其referenceCount的引用计数被置为1. 其中有三个重要的操作,retain,release,autorelease,下面源码分析时会详细说明

8、Cocos2dx 3.0游戏开发找小三之3.0版本的内存管理

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 复杂的内存管理 移动设备上的硬件资源十分有限,内存尤为宝贵,开发者必须十分慎重地利用内存,避免不必要的消耗,更要防止内存泄漏. 基于 Cocos2d-iPhone 的 Objective-C风格的内存管理是 Cocos2d-x 的一个特色. 把 Objective-C 的内存管理方式引入 C++,使得游戏开发的内存管理难度下降了个层次.

cocos2d-x内存管理(见解)

cocos2d-x 延续了cocos2d 和OC的引用计数的内存管理机制! 下面我们来看看CCDriectro类 CCPoolManager::sharedPoolManager()->push(); 基础:我们要先熟悉  release  释放该内存! CCPoint *temp = new CCPoint(controlPoint.x, controlPoint.y); m_pControlPoints->addObject(temp); temp->release(); autor