一、Cocos2d-x拷贝机制

1.CCcopying
CCObject从CCcopying继承而来,而CCcopying拥有唯一的一个成员函数copyWithZone,这个函数可以认为是拷贝的一个协议,所有继承CCObject需要实现拷贝功能可以通过它来实现,源码:
CCObject* CCcopying::copyWithZone(CCZone* pZone)
{
CC_UNUSED_ParaM(pZone);
CCAssert(0.”not implement”);
return 0;
}
2.CCObject子类拷贝
CCObject* CCObject::copy()
{
return copyWithZone(0);
}
3.CCArry
3.1 CCArray拷贝
CCArray* CCArray::createWithArray(CCArray* otherArray)
{
CCArray* pRet = (CCArray *)otherArray->copy();
pRet->autorelease();
return pRet;
}
3.2 copyWithZone实现
CCObject* CCArray::copyWithZone(CCZone* pZone)
{
CCAssert(pZone == NULL,”CCArray should not be inherited.”);
CCArray* pArray = new CCArray();
pArray->initWithCapacity(this->data->num>0?this->data->num:1);
CCObject* pObj = NULL;
CCObject* pTmpObj = NULL;
CCARRAY_FOREACH(this,pObj)//遍历CCArray成员
{
pTmpObj = pObj->copy();
pArray->addobject(pTmpObj);
pTmpObj->release();
}
return pArray;
}
3.3 深拷贝和浅拷贝
Cocos2d-x采用的都是深拷贝的方式,它们的区别在于当前对象是否包含了对其他资源的引用;在拷贝机制上采用深拷贝的方式,大大方便了我们对内存的管理,避免因资源的释放导致引用异常。

二、继续内存管理机制

1.源码:
CCObject::CCObject(void)
:m_nLuaID(0)
,m_uReference(1) //引用计数,初始为1,当引用计数为0,自动释放该对象
,m_uAutoReleaseCount(0)//自动释放对象计数,如果是手动new的,则为0,如果autoRelease的,则在AutoreleasePool会+1
//这里是保护成员,所以CCAutoreleasePool被声明为友元类
{
static unsigned int uObjectCount = 0;//静态成员,对象计数,只增不减,用于标识唯一一个对象实例
m_uID = ++uObjectCount;
}
CCObject::~CCObject(void)
{
if(m_uAutoReleaseCount>0)//如果是自动管理,则在PoolManager中删除
{
CCPoolManager::sharedPoolManager()->removeObject(this);
}
if(m_nLuaID)
{
ccScriptEngineManager::sharedManager()->getScriptEngine()->removeScriptObjectByCCOb ject(this);
}
else
{
ccScriptEngineProtocol* pEngine = ccScriptEngineManager::sharedManager()->getScriptEngine();
if(pEngine != NULL && pEngine->getScriptType() == kScriptTypeJavascript)
{
pEngine->removeScriptObjectByCCOb ject(this);
}
}
}
void CCObject::release(void)
{
CCAssert(m_uReference>0,”reference count should greater than 0”);
—m_uReference;
if(m_uReference == 0)
{
delete this;
}
}
void CCObject::retain(void)
{
CCAssert(m_uReference > 0,”reference count should greater than 0”);
++m_uReference;
}
CCObject* CCObject::autorelease(void)
{
CCPoolManager::sharedPoolManager()->addobject(this);
return this;
}
bool CCObject::isSingleReference(void) const
{
return m_uReference == 1;
}
unsigned int CCObject::retainCount(void) const
{
return m_uReference;
}
bool CCObject::isEqual(const CCObject* pObject)
{
return this == pObject;
}
void CCObject::acceptVisitor(CCDataVisitor &visitor)
{
visitor.visitObject(this);
}

2.new和release是好基友,在手动内存管理中使用;
3.retain和release也是好基友,在自动内存管理中使用;
4.addChild(background)是要对引用计数进行操作的;

Cocos2d-x::内存管理的更多相关文章

  1. 处理内存管理和iOS Cordova项目?

    任何人都可以告诉我如何处理基于iOSCordova的项目中的内存管理“收到内存警告”当我在iPhone或iPad上运行时,我在iOSCordova项目中收到此警告.我在我的应用程序中使用CDVlocation进行地理定位.我主要是在加载基于地图的视图时收到此消息.我正在使用基于ARC的Xcode项目任何帮助管理内存警告与cordova“收到内存警告”将不胜感激.谢谢你们解决方法在CDVPlugin.m中尝试这种方式

  2. xcode – Swift 1.2中的神秘崩溃 – 仅在版本中构建

    我的理论是,Swift的内存管理在优化的版本编译中出现了一些问题,只是在NSArray从Cocoa到达的特定情况下,在我们的代码可以获得它们之前,我们将它们桥接到[AnyObject].这样的NSArray没有正确地穿过桥.但是通过转换到NSArray然后回到特定的[SomeType]Swift数组,问题就解决了.当然,我认为当苹果公司指出这一点时,他们会解决这个问题,然后我们可以停止使用这种解决方法.但直到那时,我的应用程序再次在Release版本中运行.

  3. Xamarin.iOS在将C#编译为本机代码时对内存管理做了什么?

    什么Xamarin.iOS关于内存管理?使用通常的IL,我们有垃圾收集器,它处理未使用的对象和浮雕程序员调用删除.当Xamarin将代码编译为本机时,这是如何工作的?谁清理了不再使用的物体?这个问题回答了编译的工作原理,但没有解释内存管理部分:HowMonoTouchworks?

  4. swift语言的学习笔记六(ARC-自动引用计数,内存管理)

    Swift使用自动引用计数来管理应用程序的内存使用。当实例并不再被需要时,ARC会自动释放这些实例所使用的内存。swift的ARC工作过程每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息。但是,如果ARC释放了正在被使用的实例,就不能再访问实例属性,或者调用实例的方法了。为了保证需要实例时实例是存在的,ARC对每个类实例,都追踪有多少属性、常量、变量指向这些实例。

  5. Swift内存管理概述

    Object-C的内存管理经历过2个阶段:手动引用计数内存管理MRC和自动引用计数内存引用管理ARC-MRC就是由程序员自己负责对象管理生命周期,负责对象的创建和销毁,ARC的程序员不用关心对象内存释放的问题,编译器在编译的时候在合适的代码位置插入内存释放代码。以C++和C为代表的手动内存管理模式,使用起来比较麻烦,经常导致内存泄露和内存过度释放等问题。

  6. swift 值类型和引用类型

    1.Struct是值类型,拷贝是值拷贝,Class是引用类型,拷贝是引用拷贝

  7. Swift ARC-自动引用计数、内存管理

    当实例并不再被需要时,ARC会自动释放这些实例所使用的内存。测试ARC输出结果从上面的例子来看,确实swift给我们自动管理了内存,很多时侯开发者都不需要考虑太多的内存管理。尽管ARC减少了很多内存管理工作,但ARC并不是绝对安全的。但是当无宿主引用所指实例被释放时,ARC并不能将引用值设置为nil,因为非可选类型不能设置为nil。

  8. 关东升的《Swift2.0》暂定名即将出版

    关东升的《Swift2.0》(暂定名)即将出版大家好:苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我将在11月左右出版,《Swift2.0》(暂定名)Swift2.0》将在《Swift开发指南》第1版的基础上添加Swift2.0的内容,同时摒弃第1版的一些不合理的内容,使得本书更加适合Swift开发者。我将连续发一些Swift2.0的学习笔记,有兴趣者,可以看一下。

  9. 何时使用Swift Structs和Classes

    struct在绝大部分Objective-C代码中并不是很常用.我们偶尔以CGRect和CGPoint等方式接触到它们,但很少会自己去写.首先,它们不是很实用.用Objective-C在struct中正确地存储对象的引用的确很难,尤其是使用ARC的时候.很多其他语言干脆没有类似struct的东东.许多语言如同Python和JavaScript一样”万物皆对象”,只有引用类型.如果你是从这类语言转型到Swift的,你可能对struct的概念就更陌生了.等一下!

  10. Swift学习笔记(七)类和结构体

    储存属性是捆绑和储存在类或结构体中的常量或变量。定义了一个名为VideoMode的类创建类和结构体的实例属性访问注意:与Objective-C语言不同的是,Swift允许直接设置结构体属性的子属性。在Swift中,所有的基本类型:整数、浮点数、布尔值、字符串、数组和字典,都是值类型,并且都是以结构体的形式在后台所实现。在Swift中,所有的结构体和枚举都是值类型。实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部