objective

[email protected]单例

1
2
3
4
5
6
7
8
9
+ (id)sharedInstance {
static Instance *obj = nil;
@synchronized([Instance class]) {
if (!obj) {
obj = [[Instance alloc] init];
}
}
return obj;
}

2.GCD单例(推荐)

1
2
3
4
5
6
7
8
+ (id)sharedInstance {
static dispatch_once_t onceToken;
static Instance *obj = nil;
dispatch_once(&onceToken, ^{
obj = [[Instance alloc] init];
});
return obj;
}

dispatch_once的函数原型为void dispatch_once(dispatch_once_t *predicate, dispatch_block_t block)
其中,dispatch_once_tlong类型的typedef
代码为typedef long dispatch_once_t;
dispatch_block_t是一个代码块的typedef
代码为typedef void (^dispatch_block_t)(void);
这个函数的作用是使得block在整个程序的生命周期中只执行一次,此操作时是线程安全的,每次调用这段代码是通过onceToken来检查,注意onceToken必须严格初始化为0。在调用dispatch_once函数时检查到其值为0时,就执行block,执行完毕后onceToken减一。下一次调用dispatch_once函数时检查到onceToken = -1,就不会执行block。

  1. 如果oncceToken = 0,那么执行block。
  2. 如果onceToken = -1,那么不执行block并继续往下执行。
  3. 如果onceToken != 0 && onceToken != -1,那么程序将一直卡在dispatch_once函数那里。