iOS|iOS 单例模式的写法

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。意思只有一个实例。
错误写法(非线程安全)

#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; }

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

    推荐阅读