C++ 如何轻松清除cocos2d-x中的自定义共享实例?

C++ 如何轻松清除cocos2d-x中的自定义共享实例?,c++,cocos2d-x,purge,C++,Cocos2d X,Purge,我正在做一个小的Cocos2d-x项目,其中我受到了由CCDirector::sharedDirector()方法和Cocos2d-x中其他共享实例实现的“单例”模式的启发。例如,在CCDirector.cpp中 static CCDisplayLinkDirector *s_SharedDirector = NULL; // ... CCDirector* CCDirector::sharedDirector(void) { if (!s_SharedDirector) {

我正在做一个小的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();
}
purgeedirector()
方法清除所有其他共享实例,如共享动画缓存、共享精灵帧缓存等,所有实例都在同一模具中铸造。我想自己做一些,比如共享游戏大厅

我不想修改CCDirector,因为它肯定会有变化


有什么地方可以放我的清除密码吗?调用
cocos2d::CCDirector::sharedDirector()->end()
或类似调用时,是否有可能响铃回调?谢谢

好吧,也许你一开始就不应该受到单身模式的“启发”

是的,可以说它们很容易挑选,也很吸引人,但它们在99%的情况下都是糟糕的设计(包括cocos2d的大多数单件)。特别是你说了“两个”

单例基本上是全局变量的容器。全局变量(如单例变量)是最好避免的除非它们与所有其他类完全解耦并用于单一目的。NSFileManager是一个很好的例子,SimpleAudioEngine是一个很好的例子

更好的设计使用依赖对象和包含对象的树状结构,这与场景中节点的层次结构没有什么不同。在无单例设计中,“清除”对象变得微不足道。清除处理特定任务(即场景)的父most对象后,所有子对象都会随之自动清除-前提是代码中没有任何对象生存期(内存管理)错误

每个类都应该负责创建和释放它所包含的对象。“contain”指的是作为成员变量的实例指针,有时指包含实例指针的数组或字典成员变量


这篇文章解释得很好,很中肯。但这仅仅是一个开始。

在经历了一个严肃的“Douh!”时刻之后,我意识到清除自定义单例最容易放在
AppDelegate::~AppDelegate()
析构函数中,在cocos2d-x Xcode模板中提供了
AppDelegate
。我就这么做了。

谢谢你的意见!我完全同意单身模式的缺点。重新考虑我的需求,我想买一个单件游戏:一个“游戏大厅”,它可以与服务器端进行所有的对话。这是可取的,因为玩家可能同时进行多个游戏,因此一个中心实例既可以建立活动游戏的列表,也可以将游戏数据推送到“游戏”类。我会再考虑一下。