单例模式

作用:可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约了系统资源

ARC和非ARC模式下实现

ARC模式下实现单例模式

//关键在于只分配一块存储空间

@implementation Person

static Person *_instance;

+(instancetype)allocWithZone:(struct _NSZone *)zone{

  @synchronized(self){
       if(_instance == nil){
          _instance = [super allocWithZone:zone]
        }
       return _instance;
   } 
}
@interface Person() <NSCopy, NSMutableCopy>
@end
@implementation Person

static Person *_instance;

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

+(instancetype)sharedPerson{
     return [[Person alloc] init];
}

-(id)copyWithZone:(NSZone *)zone{
//对象方法,说明在调用该方法之前已经存在对象了
     return _instance;
}
-(id)mutableCopyWithZone:(NSZone *)zone{
     return _instance;
}

MRC模式下实现单例模式

单例模式:在整个程序运行过程中,对象都不会被释放

@interface Person() <NSCopy, NSMutableCopy>
@end
@implementation Person

static Person *_instance;

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

+(instancetype)sharedPerson{
     return [[Person alloc] init];
}

-(id)copyWithZone:(NSZone *)zone{
//对象方法,说明在调用该方法之前已经存在对象了
     return _instance;
}
-(id)mutableCopyWithZone:(NSZone *)zone{
     return _instance;
}
#if __has_feature(objc_arc)
//条件满足 ARC


#else
//MRC
-(oneway void)release{
    
}
-(instancetype)retain{
   return _instance;
}
-(NSUInteger)retainCount{
   return MAXFLOAT;
}
#endif

单例模式通用宏

//带参数的宏 用传进来的name替换代码中的name
#define SingleH(name) +(instancetype)share##name;
#define SingleM(name) static id _instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone{\
    
    static dispatch_once_t onceToken;\
    dispatch_once(&onceToken, ^{\
       _instance = [super allocWithZone:zone];\
    })\
    
    return _instance;\
}\
+(instancetype)shared##name{\
     return [[Person alloc] init];\
}\
-(id)copyWithZone:(NSZone *)zone{\
//对象方法,说明在调用该方法之前已经存在对象了\
     return _instance;\
}\
-(id)mutableCopyWithZone:(NSZone *)zone{\
     return _instance;\
}\
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值