iOS单例写法的记录

2019-03-29  本文已影响0人  timeQuick

在工程中经常会写一个单例模式,写单例中一般主要考虑下面几点

  • 防止调用 alloc]init]引起的问题(分配内存地址不唯一)
  • 防止调用 new 引起的问题
  • 防止调用 copy 引起的问题(不常用)
  • 防止调用 mutableCopy 引起的问题(不常用)

当然有些还要考虑ARC,MRC下的写法不同。这里不讨论MRC下的写法,只记录自己在工程中的常用两种写法。

第一种方法

实现copy,mutableCopy方法,至于为什么用_netWorkService = [[super allocWithZone:NULL] init]; 网上一这篇文章写得很清楚 Objective-C中Alloc和AllocWithZone

+ (instancetype)sharedInstance {
    static NetWorkService * _netWorkService = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //不能再使用alloc方法
        //因为已经重写了allocWithZone方法,所以这里要调用父类的分配空间的方法
        _netWorkService = [[super allocWithZone:NULL] init];
    });
    return _netWorkService;
}
+ (id)allocWithZone:(struct _NSZone *)zone{
    return [NetWorkService sharedInstance];
}

- (id)copyWithZone:(NSZone *)zone {
     return [NetWorkService sharedInstance];
}

-(id)mutableCopyWithZone:(NSZone *)zone{
     return [NetWorkService sharedInstance];
}

第二种方法

在.m中这样写

+ (instancetype)sharedInstance {
    static NetWorkService * _netWorkService = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _netWorkService = [[self alloc] init];
    });
    return _netWorkService;
}

在.h中禁外部调用copy等方法

- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
- (id)copy NS_UNAVAILABLE; // 没有遵循协议可以不写
- (id)mutableCopy NS_UNAVAILABLE; // 没有遵循协议可以不写

总结

自己常用的是第二种方法

上一篇下一篇

猜你喜欢

热点阅读