cocos2d バージョン 2.0 を使用してゲームをビルドしますが、ARC は使用しません。問題を見つけます: シングルトンが無効です。
私は2つのシングルトンMACROを使用していますが、問題は同じです。
#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
また
#ifndef SINGLETON_INTERFACE
#define SINGLETON_INTERFACE(CLASSNAME) \
+(CLASSNAME*) sharedManager;
#endif
#ifndef SINGLETON_IMPLEMENTATION
#define SINGLETON_IMPLEMENTATION(CLASSNAME) \
\
static CLASSNAME* shared##CLASSNAME = nil; \
\
+(CLASSNAME*) sharedManager \
{ \
if (shared##CLASSNAME != nil) { \
return shared##CLASSNAME; \
} \
\
@synchronized(self) { \
if (shared##CLASSNAME == nil) { \
shared##CLASSNAME = [[self alloc] init];\
} \
} \
\
return shared##CLASSNAME; \
} \
\
+(id) allocWithZone:(NSZone*)zone \
{ \
@synchronized(self) { \
if (shared##CLASSNAME == nil) { \
shared##CLASSNAME = [super allocWithZone:zone]; \
return shared##CLASSNAME; \
} \
} \
NSAssert(NO, @ "[" #CLASSNAME " alloc] explicitly called on singleton class."); \
return nil; \
} \
\
-(id) copyWithZone:(NSZone*)zone \
{ \
return self; \
} \
\
-(id) retain \
{ \
return self; \
} \
\
-(unsigned) retainCount \
{ \
return UINT_MAX; \
} \
\
-(oneway void) release \
{ \
} \
\
-(id) autorelease \
{ \
return self; \
}
#endif
使用する:
[[CCDirector sharedDirector] replaceScene:[MenuScene sharedManager]];
MenuScene が再び表示されますが、ボタン (CCMenu) またはその他の要素 (CCNode) が応答しません。つまり、最初の呼び出し、シーンはすべて問題ありません。もう一度呼び出すと、シーンは表示されますが、メニューやその他の要素は応答しません。しかし、cocos2d v1.0 では非常にうまく動作しています。
/////////////////////////////////////////////// ////////////////
次のように、「[スーパークリーンアップ]」なしで「クリーンアップ」をオーバーライドします。
-(void) dealloc
{
[super cleanup];
[super dealloc];
}
-(void) cleanup
{
//
}
さて、シングルトンを実行しているシーンは問題ありませんが、安全ですか?