我用cocos2d version2.0打造一款遊戲,不使用ARC,發現問題:單身無效。cocos2d version2.0單身無效
我用兩個單例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
{
//
}
現在,現場運行單身確定,但它安全嗎?