如何在XCode4中使用#define创建单例?

时间:2011-09-20 15:44:56

标签: xcode c-preprocessor

我正在尝试关注使用Apple文档和Matt Gallagher tutorial for interfacing Game Center"singleton" document

然而,XCode正在发出礼貌但激烈的抗议,将其抱怨称为“数据定义没有类型或存储类”。换句话说,它认为SYNTHESIZE_SINGLETON_FOR_CLASS_HEADER(GameCenterManager);是缺少类型的方法声明。 一些StackOverflow考古学引起了我对XCode的更改。

然而,它让我感到非常困惑。我是否应该在编译器设置的内部真正创建两个条目,其中一个条目长度至少为600个字符,它基本上将包含一个漂亮,整洁的头文件中的内容?

按照Matt Gallagher编写的头文件的来源,然后进入两个地方:

#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; \
}

那么,我在哪里弄错了?

1 个答案:

答案 0 :(得分:0)

我将此行添加到源文件中,现在运行正常。据我所知,如果我想定义一些东西我必须使用这个导入通知编译器我知道我在做什么。

#import <objc/runtime.h>

如果我错了,请随意纠正我。