Cocos2d iphone cocos2d版本2.0单例无效
我用cocos2dversion2.0构建了一个游戏,没有用ARC,发现了一个问题:singleton是无效的 我使用两个单例宏,问题相同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
#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
{
//
}