单例的写法

1.

#import "MySingleton.h"

static MySingleton *_singleton = nil;

+ (id)shareObject

{

    @synchronized(self){

        if (_singleton == nil) {

            _singleton = [[MySingleton alloc] init];

        }

    }

    return _singleton;

}

@end

@synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。 一般在公用变量的时候使用,如单例模式或者操作类的static变量中使用。

2.

#import "MySingleton.h"

@implementation MySingleton

+ (id)shareObject

{

    static MySingleton *_singleton = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _singleton = [[MySingleton alloc] init];

    });

    return _singleton;

}

@end

void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);
    该函数接收一个 dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为 BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。
dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如 @synchronized之类的来防止使用多个线程或者队列时不同步的问题。
 该方法有很多优势: 
           1 线程安全
           2 很好满足静态分析器要求
           3 和自动引用计数(ARC)兼容 
           4 仅需要少量代码

你可能感兴趣的:(单例)