我有以下代码:
static NSDictionary * errorDescriptions = nil;
+ (NSString *) errorsFromCode: (WPErrorCode) code {
if(errorDescriptions == nil) {
errorDescriptions = @{[NSNumber numberWithInt: InvalidCar]: NSLocalizedStringFromTable(@"Car is invalid.", @"WePay", @"validation: invalid car"), ...
}
return [errorDescriptions objectForKey: [NSNumber numberWithInt: code]];
}我得到建议将上面的代码更改为:
+ (NSString *) errorsFromCode: (WPErrorCode) code {
static NSDictionary * errorDescriptions = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
errorDescriptions = @{[NSNumber numberWithInt: InvalidCar]: NSLocalizedStringFromTable(@"Car is invalid.", @"WePay", @"validation: invalid car"), ...
}
return [errorDescriptions objectForKey: [NSNumber numberWithInt: code]];
}为什么是这种情况?为什么我要使用dispatch_once?
发布于 2013-10-21 20:36:12
您不必使用它,但是在块中放置的内容只会以线程安全的方式执行一次。
您不需要也不应该使用if errorDescriptions == nil检查是否要使用dispatch_once。
发布于 2013-10-21 20:40:25
dispatch_once用于创建初始化开销很大的对象,或者在初始化对象时阻塞其他线程。这些情况在这里都不适用。不管初始化对象多少次,也不需要特殊处理,这并不昂贵。在我看来毫无意义。布拉德说得对,如果在第二个街区是多余的。
发布于 2013-10-21 20:35:01
最有可能阻止种族状况。
https://stackoverflow.com/questions/19504099
复制相似问题