2011-09-20 49 views
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; \ 
} 

所以,我在哪裏,我理解錯了?

+0

我會質疑任何設計,單身人士是如此普遍,這樣一個#定義是必要的(更不用說涉及該單身人士實施的戲劇)。這很可能會使任何未來的重構變得更加困難。 – bbum

+0

好吧,我同意這一點,但是Gallagher指出代碼重複是不好的,無論如何你可能需要幾個單例。所以我會跟着他的領先,他比我更精明:D – Kheldar

+1

如果代碼重複是一種罪過,複雜性也是如此。我實施過的每一個單身人士都有一種方法, '+ sharedInstance'。這就是所需要的,剩下的就是噪音,隱藏錯誤,並且使得未來的重構變得更加困難。 – bbum

回答

0

我將此行添加到源文件中,現在它運行良好。據我瞭解,如果我想定義一些東西,我必須使用這個導入來通知編譯器,我知道我在做什麼。

#import <objc/runtime.h> 

如果我錯了,隨時糾正我。