iOS:创建单例对象的两种方式
单例模式:创建单例对象的两种方式
方式一:iOS4版本之前
static SingleClassManager *singleManager = nil;
+(SingleClassManager*)sharedManager
{
@synchronized(self) //同步加锁,在多线程中使用,可以使线程安全
{
if(singleManager == nil)
{
singleManager = [[SingleClassManager alloc]init];
}
}
return singleManager;
}
方式二:iOS5版本开始(block函数)
+(SingleClassManager *)sharedManager
{
static SingleClassManager *singleManager = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate,^{
singleManager = [[SingleClassManager alloc]init];
});
return singleManager;
}
该方法有很多优势:
1 线程安全
2 很好满足静态分析器要求
3 和自动引用计数(ARC)兼容
4 仅需要少量代码
说明:
该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。
dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。
程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!