次のように、複数のスレッドで何度も 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 がありました。これは、今見ているパターンに変更されました。NSMutableDictionary はスレッドセーフではないためです。私の推論は、コピーでミューテーションを実行し_itemFlagDict
、更新をキャプチャするために を再割り当てすることでした。
ただし、EXC_BAD_ACCESS
にアクセスするとクラッシュが発生する場合が_itemFlagDict
あり、objectForKey:itemID
.
私が試したもう 1 つのアプローチは@synchronized(_itemFlagDict)
、アクセサー メソッドとセッター メソッドの両方で使用することでした。これで問題は修正されましたが、このコードはパフォーマンスに敏感であり、アクセス/割り当てを同期するとパフォーマンスが大幅に低下しました。
私の質問は、パフォーマンスを犠牲にせずにこの悪いアクセスを回避するために使用できる他のパターン/方法はありますか? 優先順位付けが重要な場合は、アクセサー メソッドの実行 (鉄壁の精度である必要はありません) が最も重要です。
注:私はiOS 4以降で作業しています