0

我习惯于使用 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一起使用,我应该怎么做?我不知道为什么使用 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; \
      } \
}
4

2 回答 2

2

所以首先,让我解释一下 cocos2d-x 内存管理是如何工作的。

由于 cocos2d-x 与 cocos2d 相关,cocos2d-x 团队愿意在 object-c 中使用保留/释放的东西。

显然,一个 CCObject 只有当他的保留值大于 0 时才会被保存在内存中。

一旦你调用了函数release();,这个对象的retain值就会减1,如果达到0,就会调用析构函数。

最后是 autorelase() 函数。是什么,对于cocos2d-x,核心线程在CCPoolManager::sharedPoolManager()中持有一个CCArray。在每一帧中,该数组中的所有对象都会调用一次 release(),如果保留值 == 0,则将被删除。

所以让我们来看看这个案例。

我相信 autorelease() 是让你感到困惑的原因。当一个对象被 new ClassName() 创建时,retain == 1; 但是如果调用autorelease(),它仍然保持为1,但在下一帧会为0。

这就是为什么当你使用 this->matrix[0][0] = SomeClass::create(); 构造函数、init 和析构函数将被一一调用,但请记住,析构函数是在下一帧中调用的,而不是在 init() 之后立即调用。

那么如何使这些正确,有很多方法可以做到这一点。最简单的方法是:this->matrix[0][0] = SomeClass::create(); this->matrix[0][0]->retain();

除此之外,我强烈建议使用 CC_SYNTHESIZE_RETAIN(varType, varName, funName) 在头文件中定义一个值而不是 ClassName* valueName。

并使用 set##funName(varType var) 来设置它,而不是使用 valueName = ClassName::create()。

有关更多信息,您可以阅读 CC_SYNTHESIZE_RETAIN marco。

于 2013-11-13T02:17:09.333 回答
1

只需使用保留()..

SomeClass *newObject=SomeClass::create();
newObject->retain();
this->matrix[0][0] = newObject;

然后您需要稍后在删除此数组之前手动释放对象,否则可能会发生内存泄漏。

于 2013-11-29T07:55:03.473 回答