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