单例模版
OC
@interface XQSingleton : NSObject
+ (instancetype)shareInstance;
@end
@implementation XQSingleton
+ (instancetype)shareInstance{
static XQSingleton *shareInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shareInstance = [[super allocWithZone:NULL] init];
});
return shareInstance;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
return [self shareInstance];
}
- (id)copy{
return self;
}
- (id)mutableCopy{
return self;
}
以上代码有以下几点一一展开说:
在XQSingleton的@interface中声明shareInstance接口,提供给外部调用返回单例对象。
在类实现中shareInstance使用static XQSingleton *shareInstance,这种静态局部对象是为了保持返回对象的唯一性。
使用GCD的dispatch_once函数确保该对象的初始化方法只执行一次,保证了线程安全。
初始化使用[super allocWithZone:NULL]是为了重载当前类的allocWithZone方法,只能使用父类的对象分配方法来创建对象。
重载allocWithZone方法是为了防止外部调用alloc创建出另外一个新的XQSingleton对象。
重载copy和mutableCopy方法时为了防止外部调用copy或者mutableCopy方法时,生成新的对象。
Swift版本
final class Singleton {
private init() {}
static let shared = Singleton()
}
final保证类不能被继承,避免可以子类化,进而进行改写.
初始化方法private,保证无法被调用,这样就保证了对象的唯一性.
可以看到,Swift的单例比OC的简洁安全不少