欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS 单例模式的写法

程序员文章站 2022-07-13 23:46:04
...

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

错误写法(非线程安全)

#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。使得这个实现变得无比复杂而难以理解和控制。