Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocos2d iphone cocos2d版本2.0单例无效_Cocos2d Iphone_Singleton - Fatal编程技术网

Cocos2d iphone cocos2d版本2.0单例无效

Cocos2d iphone cocos2d版本2.0单例无效,cocos2d-iphone,singleton,Cocos2d Iphone,Singleton,我用cocos2dversion2.0构建了一个游戏,没有用ARC,发现了一个问题:singleton是无效的 我使用两个单例宏,问题相同 #ifndef SINGLETON_INTERFACE #define SINGLETON_INTERFACE(CLASSNAME) \ +(CLASSNAME*) sharedManager; #endif #ifndef SINGLETON_IMPLEMENTATION #define SINGLETON_IM

我用cocos2dversion2.0构建了一个游戏,没有用ARC,发现了一个问题:singleton是无效的

我使用两个单例宏,问题相同

#ifndef SINGLETON_INTERFACE
#define SINGLETON_INTERFACE(CLASSNAME)                  \
    +(CLASSNAME*) sharedManager;
#endif

#ifndef SINGLETON_IMPLEMENTATION
#define SINGLETON_IMPLEMENTATION(CLASSNAME)             \
                                                        \
+(CLASSNAME*) sharedManager {                           \
    static dispatch_once_t pred;                        \
    static CLASSNAME* shared##CLASSNAME = nil;          \
    dispatch_once( &pred, ^{                            \
    shared##CLASSNAME = [[self alloc] init]; });        \
    return shared##CLASSNAME;                           \
}                                                           
#endif

使用:

菜单项再次显示,但任何按钮(CCMenu)或其他元素(CCNode)都没有响应。 我的意思是第一次呼叫,场景一切正常,再次呼叫时,场景显示,但菜单或其他元素没有响应。 但是在cocos2dv1.0中运行得非常好

//////////////////////////////////////////////////////////////////

我在不使用“[super cleanup]”的情况下覆盖“cleanup”,如下所示:

-(void) dealloc
{   
    [super cleanup];
    [super dealloc];
}

-(void) cleanup 
{
    //
}

现在,场景运行singleton正常,但安全吗?

问题可能在于CCDirector对场景的子对象执行“清理”操作

cocos2dv2.0在几种情况下增加了块的使用,这些块在“清理”过程中被释放,而不管您的单例是否保留在内存中

从v2.0迁移指南:

将cleanup标志设置为YES可能会在应用程序的逻辑中产生副作用,而应用程序的逻辑仍在对释放的资源进行隐式引用。CCMenuItems在内部使用块来启动操作,如果您已从其父节点中删除该项并激活清除标志并将其添加回,则可能会出现问题而不启动操作,这是一个明显的迹象。仅仅将标志更改为NO就足够了

迁移指南:


我建议你:

  • 找到一种安全的方法来防止你的独生子女被要求“清理”
  • 或者:将所有内容作为显示/隐藏的CCLayer的子对象保留在内存中,而不是使用场景机制
  • 或者:不要每次都使用单件并重新创建场景
[[CCDirector sharedDirector] replaceScene:[MenuScene sharedManager]];
-(void) dealloc
{   
    [super cleanup];
    [super dealloc];
}

-(void) cleanup 
{
    //
}