单例的两种写法
第一种,使用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