我习惯使用Objective-C和Cocos2d,所以这里让我感到困惑。
我确实想将一些自定义对象保存到一个二维数组中,所以我这样做,在我想要数组的类的标题中:
public:
SomeClass *matrix[6][6];
并在init方法的.cpp中执行:
this->matrix[0][0] = SomeClass::create();
如果我这样做,构造函数,init和析构函数按此顺序调用...显然,令我困惑的是析构函数调用。
如果我这样做:
this->matrix[0][0] = new SomeClass;
SomeClass是CCNode的子类。
构造函数被调用,这很好......但是因为我确实想在创建时使用init方法,我该怎么办?我不知道为什么使用create方法,它会在方法返回时立即调用析构函数。
我真的不明白init方法和Create_func是怎么回事,因为我是Cocos2d-x的新手,这是我想要更好理解的东西。
这是我正在使用的创建函数:
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
答案 0 :(得分:2)
首先,让我解释一下cocos2d-x内存管理是如何工作的。
由于cocos2d-x与cocos2d有关,所以cocos2d-x团队愿意使用像object-c这样的保留/释放内容。
显然,只有当CCObject的保留值大于0时,CCObject才会被保留在内存中。
调用函数release();后,此对象的保留值将减1,如果它达到0,则将调用析构函数。
最后,autorelase()函数。它是什么,对于cocos2d-x,核心线程在CCPoolManager :: sharedPoolManager()中保存CCArray。在每个帧中,此数组中的所有对象都将调用release()一次,如果保留值== 0将被删除。
所以,让我们来看看。
我相信autorelease()是让你困惑的原因。 当一个对象由新的ClassName()创建时,retain == 1; 但如果它被称为autorelease(),它仍然保持为1,但在下一帧中将为0。
这就是为什么当你使用this-> matrix [0] [0] = SomeClass :: create();构造函数,init和析构函数将逐个调用,但请记住,析构函数是在init()之后的下一帧中调用的。
那么如何使这些正确,有很多方法可以做到这一点。 最简单的方法是: this-> matrix [0] [0] = SomeClass :: create(); 这 - >矩阵[0] [0] - >保留();
除此之外,我强烈建议使用CC_SYNTHESIZE_RETAIN(varType,varName,funName)在headder文件中定义一个值而不是ClassName * valueName。
并使用set ## funName(varType var)来设置它而不是使用valueName = ClassName :: create()。
如需了解更多信息,请阅读CC_SYNTHESIZE_RETAIN marco。
答案 1 :(得分:1)
只需使用retain()..
SomeClass *newObject=SomeClass::create();
newObject->retain();
this->matrix[0][0] = newObject;
然后你需要在删除此数组之前手动释放对象,否则可能会发生内存泄漏。