iOS 单例模式的写法

2016-04-04  本文已影响144人  高压锅炖熊

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。意思只有一个实例。

错误写法(非线程安全)

#import "DataSource.h"
@implementation DataSource
+ (DataSource *)shareDataSource {
    static DataSource *dataSource;
    if (dataSource == nil) {
        dataSource = [[DataSource alloc] init];
    }
    return dataSource;
}

正确写法

#import "DataSource.h"
@implementation DataSource
+ (DataSource *)shareDataSource {
    static DataSource *dataSource;
    @synchronized(self){
        if (dataSource == nil) {
            dataSource = [[DataSource alloc] init];
        }
    }
    return dataSource;
}

synchronized 只是保证只有同一时间只有一个操作对当前 self的操作。

GCD(推荐)

+(DataSource *)shareDataSource {
    
    static DataSource *dataSource = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        dataSource = [DataSource new];
    });
    return dataSource;
}

dispatch_once中代码只执行一次,它是同步方法,比 @synchronized快许多

普通写法

#import "DataSource.h"
static DataSource *dataSource;
@implementation DataSource
+ (DataSource *)shareDataSource {
    
    if (!dataSource) {
        dataSource = [[DataSource allocWithZone:NULL] init];
    }
    return dataSource;
}

严格单例(官方)

尽管我们很少会使用到严格的单例模式,但当真的需要的时候,还是可以实现的。
苹果官方文档提供了一个严格单例的实现(传送门)。 其重载了allocWithZone:, copyWithZone, retain, retainCount, release, autorelease。使得这个实现变得无比复杂而难以理解和控制。

上一篇下一篇

猜你喜欢

热点阅读