Cocos2d-x, Create_func и метод init, немедленно вызывают деструктор

Я привык работать с Objective-C и Cocos2d, так что вот что меня смущает.

Я хочу сохранить некоторые пользовательские объекты в двумерном массиве, поэтому я делаю так в заголовке класса, где я хочу массив, который я делаю:

public:

SomeClass *matrix[6][6];

и в .cpp в методе init я делаю:

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; \
} \
}

0

Решение

просто используйте retain () ..

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

и затем вам нужно вручную освободить объекты перед удалением этого массива, иначе может произойти утечка памяти.

1

Другие решения

Итак, прежде всего, позвольте мне объяснить, как работает управление памятью cocos2d-x.

Поскольку cocos2d-x связан с cocos2d, команда cocos2d-x готова использовать для сохранения / освобождения такие вещи, как в object-c.

Очевидно, что объект CCObject будет храниться в памяти, только если его значение сохранения больше 0.

Как только вы вызовете функцию release ();, значение сохранения этого объекта будет минус 1, а если оно достигло 0, будет вызван деструктор.

Наконец, функция autorelase (). Что такое, для cocos2d-x основной поток содержит CCArray в CCPoolManager :: sharedPoolManager (). В каждом кадре все объекты в этом массиве будут вызывать 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) для определения значения вместо ClassName * valueName в файле заголовка.

И используйте set ## funName (varType var), чтобы установить его вместо использования valueName = ClassName :: create ().

Для получения дополнительной информации вы можете прочитать на CC_SYNTHESIZE_RETAIN marco.

2

По вопросам рекламы [email protected]