1
我正在嘗試使用tutorial for interfacing Game Center,它使用Apple文檔和Matt Gallagher的"singleton" document。如何用XCode4中的#define創建一個單例?
但是,XCode發出了禮貌但激烈的抗議聲明,其投訴爲「數據定義沒有類型或存儲級別」。換句話說,它認爲SYNTHESIZE_SINGLETON_FOR_CLASS_HEADER(GameCenterManager);
是缺少類型的方法聲明。 一些StackOverflow考古學引起了我的注意,更改爲XCode。
但是,它讓我頗爲困惑。我真的應該在編譯器設置的內部創建兩個條目,其中一個條目至少有600個字符長度,它基本上將包含當前在一個漂亮的整齊頭文件中的內容?
跟隨所述頭文件的來源,由馬特·加拉格爾撰寫,然後將進入兩個地方:
#define SYNTHESIZE_SINGLETON_FOR_CLASS_HEADER(__CLASSNAME__) \
\
+ (__CLASSNAME__ *)shared##__CLASSNAME__; \
+ (void)purgeShared##__CLASSNAME__;
和
#define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \
\
static classname *shared##classname = nil; \
\
+ (classname *)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; \
} \
} \
\
return nil; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return self; \
} \
\
- (id)retain \
{ \
return self; \
} \
\
- (NSUInteger)retainCount \
{ \
return NSUIntegerMax; \
} \
\
- (void)release \
{ \
} \
\
- (id)autorelease \
{ \
return self; \
}
所以,我在哪裏,我理解錯了?
我會質疑任何設計,單身人士是如此普遍,這樣一個#定義是必要的(更不用說涉及該單身人士實施的戲劇)。這很可能會使任何未來的重構變得更加困難。 – bbum
好吧,我同意這一點,但是Gallagher指出代碼重複是不好的,無論如何你可能需要幾個單例。所以我會跟着他的領先,他比我更精明:D – Kheldar
如果代碼重複是一種罪過,複雜性也是如此。我實施過的每一個單身人士都有一種方法, '+ sharedInstance'。這就是所需要的,剩下的就是噪音,隱藏錯誤,並且使得未來的重構變得更加困難。 – bbum