iOS单例模版(OC&Swift)

单例模版

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的简洁安全不少

你可能感兴趣的:(iOS单例模版(OC&Swift))