我有跨多个线程多次访问和设置 NSDictionary 的代码,如下所示:
- (BOOL)flagForItem:(NSNumber*)itemID
{
if(itemID) {
return [[_itemFlagDict objectForKey:itemID] boolValue]
}
return NO;
}
和:
- (void)setFlagForItem:(NSNumber*)itemID
{
if(itemID) {
NSMutableDictionary *copy = [_itemFlagDict mutableCopy];
[copy setObject:[NSNumber numberWithBool:YES] forKey:itemID];
_itemFlagDict = [NSDictionary dictionaryWithDictionary:copy];
}
}
在 set 方法中,我最初有一个 NSMutableDictionary - 这已更改为您现在看到的模式,因为,Doh,NSMutableDictionary 不是线程安全的。我的理由是在副本中执行突变,然后重新分配_itemFlagDict
以捕获更新。
但是,EXC_BAD_ACCESS
访问._itemFlagDict
objectForKey:itemID
我尝试的另一种方法是@synchronized(_itemFlagDict)
在访问器和设置器方法上都使用。虽然这解决了问题,但此代码对性能很敏感,并且同步访问/分配会导致过多的性能下降。
所以我的问题是,我可以使用其他模式/方法来避免这种不良访问,同时不影响性能吗?如果优先级很重要,那么访问器方法的执行(不一定是铁定的准确性)是最重要的。
注意:我正在使用 iOS 4 及更高版本