ich eine Klasse Dictionary
, wo die init
Methode wie folgt aussieht genannt haben:eine große NSDictionary Eigenschaft auf einem Nicht-Haupt-Thread Einstellung
- (id) init{
self = [super init];
if (self){
[self makeEmojiDictionaries];
}
return self;
}
- (void)makeEmojiDictionaries{
//next line triggers bad_exc_access error
self.englishEmojiAllDictionary = @{@"hi" : @""}; //this is a strong, atomic property of NSDictionary
};
Mein Problem ist, dass der tatsächliche Emoji-Wörterbuch ist recht groß, und ich wollen alle schweren Lasten in einem Nicht-Haupt-Thread mit GCD zu tun. Jedoch, wenn ich zu der Zeile komme, wo ich self.englishEmojiAllDictionary
setze, bekomme ich immer einen bad_access
Fehler.
Ich bin mit GCD in der normalste Art und Weise möglich:
dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);
dispatch_async(myQueue, ^{
//Do long process activity
Dictionary *dictionary = [[Dictionary alloc] init];
});
Gibt es bestimmte Nuancen zu GCD oder Nicht-Haupt-Thread Arbeit, die ich fehle? Jede Hilfe wird sehr geschätzt - danke!
Edit 1:
Falls Sie es möchten selbst versuchen. Ich habe eine sample project hochgeladen, die diese Ausnahme repliziert. Meine Theorie ist, dass die NSDictionary
I Initialisierung ist einfach zu groß.
Aus welcher Klasse stammt das Wörterbuch? – Shripada
Hallo @Shripada, 'Dictionary' erbt von' NSObject' – daspianist
Ihr Beispiel legt 'englishEmojiAllDictionary' nicht wirklich fest. Es ist unklar, wo du zusammenstößt. Schreibst du sonst irgendwo an 'englishEmojiAllDictionary', oder sind alle anderen Anrufer schreibgeschützt? Ist 'englishEmojiAllDictionary' öffentlich oder privat (können externe Objekte direkt oder nur durch Aufruf von Methoden auf 'Dictionary' zugreifen)? Wenn Sie nicht in einer anderen Warteschlange als "Meine Warteschlange" lesen, werden Sie Kollisionen haben, aber Sie würden erwarten, dass der Absturz auf dem Leser und nicht auf dem Schreiber liegt. Machst du etwas, um sicherzustellen, dass es keine Leser gibt, bevor "makeEmojiDictionaries" abgeschlossen wird? –