правильное создание экземпляров и управление памятью в cocos2d-x

Я искал документацию для cocos2d-x, но она кажется очень плохой, если не считать самых основ. Я понимаю, что мои собственные классы должны наследоваться от CCObject, чтобы иметь возможность использовать (изначально какао) механизм retain/release, но я все еще не понимаю, что происходит, когда вы что-то new делаете. init не вызывается автоматически. можно ли вызывать его из конструктора? только это гарантирует, что мой объект будет начинаться с счетчика ссылок, равного 1? что такое CC_SAFE_DELETE и когда его использовать? release и autorelease работают точно так же, как в какао? как насчет CC_SYNTHESIZE? Мне просто нужно увидеть правильно закодированный пример класса (и его создание/уничтожение), чтобы понять, что я должен делать, чтобы не напортачить и не оставить утечек памяти. благодарю вас.


person maltalef    schedule 22.05.2012    source источник


Ответы (2)


Если вы посмотрите на код класса CCObject, то увидите, что в его конструкторе счетчик ссылок установлен в 1. Итак, создание объекта с помощью new правильно. Init не вызывается, потому что в классе CCObject нет такого метода. Обычно я предпочитаю создавать объекты с помощью статического конструктора. Что-то вроде

MyClass* MyClass::createInstance()
{
    MyClass* object = new MyClass();

    // you can create virtual init method
    // and call it here

    if( initWasSuccessful )
    {
        object->autorelease();
    }
    else
    {
        CC_SAFE_RELEASE_NULL(object);
    }
    return object;
}

Про все макросы типа CC_SAFE_DELETE — вы можете узнать их в коде cocos2dx. Эти макросы просто проверяют, является ли объект NULL, чтобы предотвратить сбой при попытке вызвать метод выпуска.

person Morion    schedule 24.05.2012
comment
спасибо! Вы вдохновили меня на создание этого макроса: pastebin.com/WKKZ5EBN, если у вас есть предложения по его улучшению, я могу открыть другой вопрос по этому поводу. Я надеюсь, что кто-то еще найдет это полезным. - person maltalef; 31.05.2012

Ответ, предоставленный Морионом, великолепен, я просто хотел бы добавить несколько полезных ссылок по этому вопросу.

Здесь вы можете найти официальное управление памятью на странице Cocos2d-x: Memory Управление в Cocos2d-x

Эта страница форума также содержит некоторые дополнительные сведения и разъяснения по этому поводу: Освобождение памяти в Cocos2d-x

Наслаждайтесь кодированием!

person Fuzzy Mind    schedule 19.11.2012