NSMutableDictionary
ist nicht auf dem Threadsichere Datenstruktur, gestaltet und einfach Markierung die Eigenschaft als atomic
, stellt nicht sicher, dass die zugrundeliegenden Daten Operationen werden atomar tatsächlich durchgeführt (in einer sicheren Weise).
// in initialization
self.dictionary = [[NSMutableDictionary alloc] init];
// create a lock object for the dictionary
self.dictionary_lock = [[NSLock alloc] init];
// at every access or modification:
[object.dictionary_lock lock];
[object.dictionary setObject:image forKey:name];
[object.dictionary_lock unlock];
Sie sollten Ihre eigenen NSDictionary
die einfach Delegierten ruft NSMutableDictionary betrachten rollen:
Um sicherzustellen, dass jeder Betrieb in einer sicheren Weise durchgeführt wird, würden Sie jede Operation auf dem Wörterbuch mit einer Sperre schützen müssen während einer Sperre hält:
@interface SafeMutableDictionary : NSMutableDictionary
{
NSLock *lock;
NSMutableDictionary *underlyingDictionary;
}
@end
@implementation SafeMutableDictionary
- (id)init
{
if (self = [super init]) {
lock = [[NSLock alloc] init];
underlyingDictionary = [[NSMutableDictionary alloc] init];
}
return self;
}
- (void) dealloc
{
[lock_ release];
[underlyingDictionary release];
[super dealloc];
}
// forward all the calls with the lock held
- (retval_t) forward: (SEL) sel : (arglist_t) args
{
[lock lock];
@try {
return [underlyingDictionary performv:sel : args];
}
@finally {
[lock unlock];
}
}
@end
Bitte beachten sie, dass, da jeder Betrieb für die Sperre warten erfordert und hält es, ist es nicht ganz skalierbar, aber es könnte in Ihrem Fall gut genug sein.
Wenn Sie eine richtige Thread-Bibliothek verwenden möchten, können Sie TransactionKit library verwenden, da sie TKMutableDictionary
haben, die eine sichere Multithread-Bibliothek ist. Ich persönlich habe es nicht benutzt, und es scheint, dass es eine Work-in-Progress-Bibliothek ist, aber Sie sollten es vielleicht versuchen.
Ich bin kein Experte für Multithreading, aber ich weiß, dass das "atomische" Flag (der Standard für @ synthetisierte Accessoren) keine Garantien für die Threadsicherheit gibt. Ich habe das gleiche gedacht, als ich das erste Mal darüber gelesen habe. –