ARC和MRC实现单例模式

代码如下,可直接拷贝到头文件中

#define singleton_h(name) +(instancetype)shared##name
# if __has_feature(objc_arc) //ARC

#define singleton_m(name) 
static id _instance;
+(id)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
}

+(instancetype)shared##name
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc] init];
    });
    return _instance;
}

+(id)copyWithZone:(struct _NSZone *)zone
{
    return _instance;
}
#else //非ARC
#define singleton_m(name) 
static id _instance;
+(id)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}

+(instancetype)shared##name
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;
}

+(id)copyWithZone:(struct _NSZone *)zone
{
return _instance;
}
-(oneway void)release
{
    
}
-(instancetype)autorelease
{
    return _instance;
}
-(instancetype)retain
{
    return _instance;
}
-(NSUInteger)retainCount
{
    return 1;
}

#endif

MRC要重写四个方法:

-(oneway void)release

{   

}

-(instancetype)autorelease

{

    return self;

}

-(instancetype)retain{

    

    return self;

}

-(NSUInteger)retainCount{

    return 1;

}

原文地址:https://www.cnblogs.com/tmacforever/p/4718723.html