Я привык работать с 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; \
} \
}
просто используйте retain () ..
SomeClass *newObject=SomeClass::create();
newObject->retain();
this->matrix[0][0] = newObject;
и затем вам нужно вручную освободить объекты перед удалением этого массива, иначе может произойти утечка памяти.
Итак, прежде всего, позвольте мне объяснить, как работает управление памятью 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.