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

一、简介

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

Cocos2d-x借鉴了“引用计数”思想,实现了一定程度上的自动内存管理。cocos2d委托对象管理池PoolManager存放对象和释放对象资源,管理池释放对象的判据是对象的引用计数为0。

二、Ref类

Ref类实现了与cocos2d内存管理机制交互的接口,所有Ref的子类对象的内存能够被管理池自动管理。Ref类的接口如下:

//////////////////////////////////////
// 该方法能够增加Ref对象的引用计数
void retain();

/////////////////////////////////
// 减少 Ref 对象的引用计数,
// 如果计数减少到0,则对象被释放
void release();

////////////////////////////////
// 没有立即减少引用计数,
// 而是在结束当前pool池时,减少Ref对象的引用计数
// 如果计数减少到0,则对象被释放
void autorelease();

当实例化一个Ref类的子类时,调用该对象的retain方法能够使计数加1。下面看一下常用的Ref子类Scene类的create方法的实现原理:

Scene* Scene::create()
{
    Scene *ret = new (std::nothrow) Scene();
    if (ret && ret->init())
    {
        ret->autorelease();
        return ret;
    }
    else
    {
        CC_SAFE_DELETE(ret);
        return nullptr;
    }
}

实例化Scene类后,立即调用autorelease方法,如果返回的ret被其它地方使用(也就是调用对象的retain方法使引用计数加1),那么在本次pool池结束后对象不会被销毁;如果返回的ret没有被使用,那么本次poo池结束后对象被销毁以防止内存溢出。

////////////////////////////////////////
// 返回的ret被addChild方法使用
// addChild内部会调用ret的retain方法使引用计数加1
// 本次pool池结束后ret指向对象不会被释放
this->addChild(Scene::create());    // create返回ret指针

再举一些例子。

///////////////////////////////////////
// __Array是Ref的子类
// 必须显式调用retain方法,否则count方法出错
// 因为array引用计数为0,pool结束后将其释放
auto array = __Array::create();
array.retain();
....
array.count();  // 在上次pool结束后,比如按键回调中使用
///////////////////////////////////////
// addObject方法能够显式调用sprite.retain(),
// 所以对象不会被释放
Sprite *sprite = Sprite::create();
array.addObject(sprite);
....
Sprite *sp = (Sprite*) array.getLastObject(); // 在上次pool结束后,比如按键回调中使用

下面总结一下cocos2d管理内存的一些规则

  • 在使用Node节点对象的时候,addChild()方法能够隐式调用被添加节点的retain方法,removeChild()方法能够调用被移除对象的release方法。
  • 如果是__Array和__Dictionary等由coco2d的类,它们本身是Ref的子类,它们添加或者删除元素时能够相应地隐式调用retain和release方法。但前提是,__Array和__Dictionary的对象需要被retain以保证不被释放掉。
  • 如果不是上述的Ref子类对象,需要显式并且成对地调用retain和release方法。
时间: 2024-10-12 02:02:46

Cocos2d之Ref类与内存管理使用详解的相关文章

Android内存管理机制详解 (zhuan)

http://www.2cto.com/kf/201212/175786.html 与windows内存区别 在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这方面,区别于 Windows的内存管理.主要特点是,无论物理内存有多大,Linux都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能.而Windows是只在需要内存时,才为应用程序分配内存,

SAP 内存管理参数详解

ST02,这里是内存管理参数详解 初学SAP看到很内存管理参数会有一头雾水,不知如何解读,这里之接上货 这只是一个例子,实际设中,我们会通常直接设定以下: rdisp/roll_maxfs=125000 rdisp/roll_shm=125000 rdisp/PG_shm=312500 rdisp/PG_maxfs=312500 原文地址:https://www.cnblogs.com/tingxin/p/11958011.html

iOS- 非ARC的项目内存管理细节详解(实战)

1.前言 接上文:iOS- 如何将非ARC的项目转换成ARC项目(实战) 2.内存管理时相关的配置 当我们把将非ARC的内存管理都管理好后,发现在做有些操作的时候内存还是在一直的缓慢增加 比如做一个最简单的随机数UITableView的显示与滑动,进行内存管理后,不应该出现内存增加的,但是一直滑动内存就一直缓慢的往上增加的情况. 这时候我们可以检查下看这里的属性是否打勾: 或者检测app一启动时控制台有没有立即输出下列这句话 如果勾上,上面三个选项,控制台就会出现下列几行输出 ARCTest(6

ARC内存管理机制详解

ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数.有自动引用计数,那么就得有手动引用计数MRC(Mannul Reference Counting),前面已经提到过了MRC.那么在ARC模式下是不是意味着我们就可以一点也不用进行内存管理的呢?并不是这样的,我们还需要代码进行内存的管理.下面会结合着代码把OC中的ARC机制做一个详细的总结(欢迎大家批

Android 内存管理机制详解

??嵌入式设备的一个普遍特点是内存容量相对有限.当运行的程序超过一定数量时,或者涉及复杂的计算时,很可能出现内存不足,进而导致系统卡顿的现象.Android 系统也不例外,它同样面临着设备物理内存短缺的困境.对于已经启动过一次的Android程序,再一次启动所花的时间会明显减少.原因在于Android系统并不马上清理那些已经"淡出视野"的程序(比如你调用Activity.finish退出UI界面).它们在一定的时间里仍然驻留在内存中.这样做的好处是明显的,即下一次启动不需要再为程序重新

ucos内存管理原理详解

应用程序中为了某种特殊需要,经常需要动态的分配内存,而操作系统的特质置一,就是能不能保证动态内存分配的时效性,也就是说分配时间是可确定的 Ucos提供内存分配功能,它将内存空间分为两级管理,将一块连续的内存空间分为若干个分区,每个分区单位又分成大小相同的若干个内存块,分区时操作系统的管理单位,而内存块是分配单位,内存分区以及内存块的使用情况有一个叫做内存控制块的表来记录,内存控制块的基本结构如下 typedef struct os_mem { void   *OSMemAddr; void  

memcached内存管理机制详解

    我们知道,memcached是一个内存缓存系统,因此对于内存的管理是需要使用者了解的.本文将对memcached的内存模型及管理机制做一个详细的描述. 基本概念 在开始之前,有必要先了解几个基本概念: 1.slab class:在memcached中,对元素的管理是以slab为单元进行管理的.每个slab class对应一个或多个空间大小相同的chunk.参考下图一. 2.chunk:存放元素的最小单元.用户数据item(key.value等)最终会保存在chunk中.memcach

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

OC5_复合类的内存管理

// // Person.h // OC5_复合类的内存管理 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxueming. All rights reserved. // #import <Foundation/Foundation.h> @interface Person : NSObject //先release 再 copy @property (copy,nonatomic) NSStrin