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_t
是long
类型的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。
- 如果
oncceToken = 0
,那么执行block。
- 如果
onceToken = -1
,那么不执行block并继续往下执行。
- 如果
onceToken != 0 && onceToken != -1
,那么程序将一直卡在dispatch_once
函数那里。
近期评论