单例的两种写法
第一种,使用GCD,利用dispatch_once方法。
dispatch_once函数如下:
void dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);
dispatch_once
接收两个参数,一个是dispatch_once_t
,一个是块参数
。对于给定的predicate
,该函数保证相关代码块必定会执行,并且只执行一次,最重要的是这个方法是线程安全的。注意,对于只执行一次的块,传入的predicate
必须是完全相同的,所以predicate
常常会用static
或者global
来修饰。
MyClass.h
+ (id)shareManager;
MyClass.m
+ (id)shareManager {
static MyClass *shareMyClass;
@synchronized(self) {
if (shareMyClass == nil) {
shareMyClass = [[self alloc] init];
}
}
return shareMyClass;
}
第二种,不使用GCD
MyClass.m
+ (id)shareManager {
static MyClass *shareMyClass;
@synchronized(self) {
if (shareMyClass == nil) {
shareMyClass = [[self alloc] init];
}
}
return shareMyClass;
}
使用GCD的好处就是dispatch_once
就确保了代码只会运行一次,并且不需要考虑线程安全的问题,因为GCD自己已经确保了线程的安全。
参考文章:
http://www.galloway.me.uk/tutorials/singleton-classes/
http://blog.csdn.net/sakulafly/article/details/34948689