oc85--利用宏定义简化单例

时间:2022-08-13 15:32:09
//Singleton.h

// 以后就可以使用interfaceSingleton来替代后面的方法声明。    \表示下一行也是上一行的内容。

#define interfaceSingleton(name)  +(instancetype)share##name

#if __has_feature(objc_arc)

//ARC编译这段

#define implementationSingleton(name)  \
+ (instancetype)share##name \
{ \
name *instance = [[self alloc] init]; \
return instance; \
} \
static name *_instance = nil; \
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[super allocWithZone:zone] init]; \
}); \
return _instance; \
} \
- (id)copyWithZone:(NSZone *)zone{ \
return _instance; \
} \
- (id)mutableCopyWithZone:(NSZone *)zone \
{ \
return _instance; \
}
#else // MRC,编译这段。 #define implementationSingleton(name) \
+ (instancetype)share##name \
{ \
name *instance = [[self alloc] init]; \
return instance; \
} \
static name *_instance = nil; \
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[super allocWithZone:zone] init]; \
}); \
return _instance; \
} \
- (id)copyWithZone:(NSZone *)zone{ \
return _instance; \
} \
- (id)mutableCopyWithZone:(NSZone *)zone \
{ \
return _instance; \
} \
- (oneway void)release \
{ \
} \
- (instancetype)retain \
{ \
return _instance; \
} \
- (NSUInteger)retainCount \
{ \
return MAXFLOAT; \
}
#endif
//
// Tools.h #import <Foundation/Foundation.h>
#import "Singleton.h" @interface Tools : NSObject<NSCopying, NSMutableCopying> // share + 当前的类名
//+ (instancetype)shareTools; interfaceSingleton(Tools); ////用Singleton.h里面的内容替换。 @end
//
// Tools.m #import "Tools.h" @implementation Tools /*
+ (instancetype)shareTools
{
Tools *instance = [[self alloc] init];
return instance;
} static Tools *_instance = nil;
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[super allocWithZone:zone] init];
});
return _instance;
} - (id)copyWithZone:(NSZone *)zone{ return _instance;
} - (id)mutableCopyWithZone:(NSZone *)zone
{
return _instance;
} // MRC
- (oneway void)release
{ } - (instancetype)retain
{
return _instance;
} - (NSUInteger)retainCount
{
return MAXFLOAT;
}
*/ implementationSingleton(Tools) ////用Singleton.h里面的内容替换。 @end
//
// Person.h
// #import <Foundation/Foundation.h>
#import "Singleton.h" @interface Person : NSObject interfaceSingleton(Person); ////用Singleton.h里面的内容替换。 @end
//
// Person.m #import "Person.h" @implementation Person implementationSingleton(Person) //用Singleton.h里面的内容替换。 @end
//
// main.m
// 宏定义抽取单例,宏定义本质是替换,简化代码,用公用的代码进行替换。
// #import <Foundation/Foundation.h>
#import "Tools.h"
#import "Person.h" int main(int argc, const char * argv[]) { Tools *t1 = [[Tools alloc] init]; //内部会调用allocWithZone
Tools *t2 = [Tools new];// [[alloc] init] allocWithZone
Tools *t3 = [Tools shareTools]; Tools *t4 = [t3 copy];
Tools *t5 = [t3 mutableCopy]; NSLog(@"%p, %p, %p, %p, %p", t1, t2, t3, t4, t5);//0x100300120, 0x100300120, 0x100300120, 0x100300120, 0x100300120 Person *p1 = [Person sharePerson];
Person *p2 = [Person sharePerson];
Person *p3 = [Person sharePerson]; NSLog(@"%p, %p, %p", p1 , p2, p3);//0x100202460, 0x100202460, 0x100202460 // 如何判断当前是ARC还是MRC?
// 可以在编译的时候判断当前是否是ARC
#if __has_feature(objc_arc)
NSLog(@"ARC");
#else
NSLog(@"MRC");
#endif
return ;
}