美文网首页
iOS 单例模式的写法

iOS 单例模式的写法

作者: 高压锅炖熊 | 来源:发表于2016-04-04 23:42 被阅读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。使得这个实现变得无比复杂而难以理解和控制。

    相关文章

      网友评论

          本文标题:iOS 单例模式的写法

          本文链接:https://www.haomeiwen.com/subject/dwcplttx.html