Я делаю небольшой проект Cocos2d-x, где меня вдохновил шаблон «синглтон», реализованный CCDirector::sharedDirector()
метод и другие общие экземпляры в Cocos2d-x. Например, в CCDirector.cpp
у нас есть
static CCDisplayLinkDirector *s_SharedDirector = NULL;
// ...
CCDirector* CCDirector::sharedDirector(void)
{
if (!s_SharedDirector)
{
s_SharedDirector = new CCDisplayLinkDirector();
s_SharedDirector->init();
}
return s_SharedDirector;
}
void CCDirector::purgeDirector()
{
// cleanup scheduler
getScheduler()->unscheduleAll();
// ...
// delete CCDirector
release();
}
purgeDirector()
Метод очищает все другие общие экземпляры, такие как общий кэш анимации, общий кэш кадров спрайтов и т. д. — все они приводятся в одной форме. Я бы хотел сделать пару из них сам, как общее игровое лобби.
Я бы предпочел не изменять CCDirector, так как он определенно может быть изменен.
Есть ли какое-нибудь естественное место, где я мог бы поставить свой код очистки? Есть ли возможность для звонка при cocos2d::CCDirector::sharedDirector()->end()
называется или похоже? Спасибо!
Ладно, может быть, вы не должны «вдохновляться» паттерном Синглтона?
Да, их, вероятно, легко подобрать и они заманчивы, но они также плохой дизайн в 99% всех случаев (включая большинство синглетонов cocos2d). Тем более, что вы сказали «пару таких».
Синглтон — это, по сути, контейнер для глобальных переменных. Глобальные переменные (например, синглтоны) лучше избегать если они полностью отделены от всех других классов и служат единственной цели. Хороший пример — NSFileManager или синглтон SimpleAudioEngine.
В лучшем проекте используется древовидная структура зависимых и содержащихся объектов, похожая на иерархию узлов в сцене. В одноэлементном дизайне «чистка» объектов становится тривиальной. После очистки самого родительского объекта, обрабатывающего конкретную задачу (т. Е. Сцены), все объекты-потомки автоматически удаляются вместе с ним — при условии, что в коде нет ошибок времени жизни объекта (управление памятью).
Каждый класс должен отвечать за создание и освобождение объекта, который он содержит. Под «содержать» я имею в виду указатели экземпляра как переменные-члены или иногда переменные-члены массива или словаря, содержащие указатели экземпляра.
Эта статья объясняет Жизненные циклы объектов C ++ ну и к делу. Но это только начало.
После серьезного «Доу!» момент, когда я понял, что чистка пользовательских синглетонов будет легче всего AppDelegate::~AppDelegate()
деструктор, где AppDelegate
предоставляется в шаблоне X-кода cocos2d-x. Так я и сделал.