·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> ARC和MRC实现单例模式

ARC和MRC实现单例模式

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

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

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

}