在多线程中,单例的实现也要考虑线程安全问题。
1.通过GCD dispatch_once来实现:
1 | @property (nonatomic, strong) NSString *str; |
1 2 3 4 5 6 7 8 9 | - (NSString *)str { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (!_str) { _str = [[NSString alloc] init]; } }); return _str; } |
当然这是在ARC情况下,如果是MRC情况下str被释放了,那么再访问str时会应用崩溃,被释放的内存,野指针,因为dispatch_once确实只执行一次。
而下面代码就不同了。
1 2 3 4 5 6 7 8 9 10 | - (NSString *)str { if (!_str) { @synchronized(self) { if (!_str) { _str = [[NSString alloc] init]; } } } return _str; } |