单例模式,该方法只会返回全类共用的单例实例,不会每次调用都创建新的实例。
总结:
1.GCD提供的dispatch_once函数可以很容易实现单例。
2.标记声明在static或global作用域中。
@implementation EOCClass
+(id)sharedInstance {
static EOCClass *sharedInstance = nil;
@synchronized(self) {
if (!sharedInstance) {
sharedInstance = [[self alloc] init];
}
}
return sharedInstance;
}
@end
GCD引入了一项新特性,实现单例更为容易。
void dispatch_once(dispatch_once_t *token, dispatch_block_t block);
这个函数保证块必定会执行,而且只执行一次。这个操作完全是线程安全的。
+(id)sharedInstance {
static EOCCLass *sharedInstance = nil;
stat icdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
dispatch_once可以简化代码,并且保证线程安全。每次调用都必须使用完全相同的标记dispatch_once_t,标记要证明成static。这个函数用“原子访问”查询标记,以判断代码是否已经执行过。后者比前者速度快一倍。
总结:
1.GCD提供的dispatch_once函数可以很容易实现单例。
2.标记声明在static或global作用域中。