// .h #define singleton_interface(class) + (instancetype)shared##class; // .m #define singleton_implementation(class) static class *_instance; + (id)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; }); return _instance; } + (instancetype)shared##class { if (_instance == nil) { _instance = [[class alloc] init]; } return _instance; }