0

我有跨多个线程多次访问和设置 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访问._itemFlagDictobjectForKey:itemID

我尝试的另一种方法是@synchronized(_itemFlagDict)在访问器和设置器方法上都使用。虽然这解决了问题,但此代码对性能很敏感,并且同步访问/分配会导致过多的性能下降。

所以我的问题是,我可以使用其他模式/方法来避免这种不良访问,同时不影响性能吗?如果优先级很重要,那么访问器方法的执行(不一定是铁定的准确性)是最重要的。

注意:我正在使用 iOS 4 及更高版本

4

2 回答 2

0

你试过读/写锁吗?您可以在 get 方法中有多个线程,在 set 方法中有一个 writer https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/pthread.3.html

于 2013-03-07T20:19:50.447 回答
0

我也遇到了同样的问题,我目前的解决方案是使用原子操作来实现线程安全的字典。您可以查看它:https ://github.com/bangquangvn/FastestThreadsafeDictionary-iOS

我认为这是最快的解决方案。

于 2016-09-01T08:13:11.137 回答