0

我正在做一个小型 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()被调用或类似时响起回调?谢谢!

4

2 回答 2

1

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

是的,它们可以说很容易上手并且很诱人,但在 99% 的情况下它们也是糟糕的设计(包括大部分 cocos2d 的单例)。特别是因为你说“其中几个”。

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

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

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

这篇文章很好地解释了C++ 对象的生命周期。但这只是一个开始。

于 2013-09-05T19:15:02.130 回答
0

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

于 2013-09-06T09:43:54.773 回答