一:创建 宏 文件 SynthesizeSingleton.h
SynthesizeSingleton.h #if __has_feature(objc_arc) // ARC Version #define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) + (classname *)shared##classname { static classname *shared##classname = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ shared##classname = [[classname alloc] init]; }); return shared##classname; } #else // Non-ARC Version #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; } - (oneway void)release { } - (id)autorelease { return self; } #endif
二:使用
MyClass.h @interface MyClass : NSObject +(DataStorage *)sharedMyClass; @end MyClass.m #import "SynthesizeSingleton.h" @implementation MyClass SYNTHESIZE_SINGLETON_FOR_CLASS(MyClass) @end