#c #cocos2d-x
#c #cocos2d-x
Вопрос:
У меня есть вопрос о CCArray. Я написал код следующим образом.
h.file
class GameScene : public cocos2d::CCLayer{
public:
CCArray *arrayA;
CCArray *arrayB;
void funcA();
void funcB();
CREATE_FUNC(GameScene);
}
cpp.file
void GameScene::funcA()
{
arrayA = new CCArray;
arrayB = new CCArray;
//---------------About arrayA-------------------------
CCDictionary *plist = CCDictionnary::createWithContentsOfFile("Data.plist");
arrayA = (CCArray*) plist->objectForKey("fruit");
CCLog("size of arrayA is %d ",arrayA->count() ); //ok (size = 3)
//---------------About arrayB-------------------------
CCSprite *obj =CCSprite::create("sample.png");
arrayB->addobject(obj);
CCLog("size of arrayB is %d ",arrayB->count() ); //ok (size = 1)
funcB();
}
void GameScene::funcB()
{
CCLog("size of arrayA is %d ",arrayA->count() ); // appear the error (size = 102938312)
CCLog("size of arrayB is %d ",arrayB->count() ); // ok (size = 1)
}
Подробная информация о Data.plist
<plist version="1.0">
<dict>
<key>fruit</key>
<array>
<string>apple</string>
<string>orange</string>
<string>strawberry</string>
</array>
</dict>
</plist>
В funcA я объявил CCArrayA и CCArrayB. Я добавил объект в каждый массив по-разному.
Затем каждый массив отображал каждый размер массива с помощью CCLog, затем ни массив, ни ошибка не появлялись.
Но в функции B, хотя arrayB не изменил размер так же, как время выполнения функции, arrayA изменяет размер на странное значение.
Почему такое произошло?
Случайно, когда побег из funcA, CCArrayA освобожден?
В таком случае, что я должен сделать, чтобы предотвратить выпуск CCArrayA?
Ответ №1:
Если вы получаете массив из файла plist, вам не нужно создавать его с помощью оператора new . Просто назначьте указатель на элемент CCArray *, и если вы хотите получить к нему доступ во всех функциях-членах, то вы должны сохранить его после назначения. В противном случае он будет выпущен и вызовет исключение или станет мусором, когда управление выйдет из функции.
Комментарии:
1. Спасибо за ваш ответ. Я понимаю, что я должен сохранить CCArray после назначения. Благодаря вам у меня был хороший опыт.