在工程中经常会写一个单例模式,写单例中一般主要考虑下面几点
- 防止调用 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; // 没有遵循协议可以不写
总结
自己常用的是第二种方法
网友评论