2016-03-22 7 views
0

Mein Ziel ist es, eine große Menge an Daten auf einem anderen (Nicht-Haupt) -Thread zu initialisieren, und aktualisieren Sie dann eine UIProgressView auf dem Hauptthread entsprechend dem Fortschritt der großen Daten laden. Um dies zu tun, verwende ich performSelectorInBackground, um die Daten zu laden, und den Fortschritt auf dem ganzen Weg mit performSelectorOnMainThread zu aktualisieren.Festlegen von Daten im Hintergrund Thread und Erhalten bad_access Fehler

Ich bekomme derzeit einen EXE_BAD_ACCESS Fehler von einem der Wörterbücher, die ich initialisiere, speziell die Zeile, wo ich self.someDictionary = @{...} setze. self.someDictionary übernimmt die Eigenschaften strong und nonatomic und wird im Nicht-Haupt-Thread initialisiert.

Als insgesamt Neuling auf Multithreading, beginne ich zu sehen, dass ich nicht eine starke und nonatomic Eigenschaft festlegen sollte (es jedoch zu atomic noch verursachte den Absturz zu ändern). Was mache ich sonst noch falsch, um den EXE_BAD_ACCESS Fehler zu verursachen, und wie stelle ich eine große Menge von Daten zu einem NSDictionary auf einem Nicht-Hauptthread ein und bin immer noch in der Lage, den Fortschritt im Hauptthread zu aktualisieren?

Danke!

Edit 1:

Code:

//In viewWillAppear, from the main thread 
[self performSelectorInBackground:@selector(populateDictionaries) withObject:nil]; 

//In populateDictionaries method 
Dictionary *someDictionary = [[Dictionary alloc] init]; 

//the methods inside the Dictionary class 
- (id) init{ 
    self = [super init]; 
    if (self){ 
     [self makeDictionaries]; 
    } 

    return self; 
} 
- (void)makeDictionaries{ 

    self.insiderDictionary = @{ ...} //this line is causing the crash 

} 
+0

bitte post ur Code – Mukesh

+0

Dank @muku - Ich postete den Code, der zeigt, wenn ich das 'performSelectorInBackground' aufrufen, und schließlich welche Methode die bad_access Ausnahme verursacht. – daspianist

+0

Stellen Sie sicher, dass Ur-Code in Einzel-Thread funktioniert –

Antwort

0

Wenn Sie den Prozess im Hintergrund try Absende-Warteschlange

ref ausführen möchten: https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

Danke.

+0

Hallo Vivek, danke für das Posten. Wenn Sie bestimmte Codevorschläge oder ähnliche SO-Fragen haben, die Sie verknüpfen könnten, wäre das sehr hilfreich. Obwohl mir GCD und das Konzept der Warteschlangen bekannt sind, hilft mir die Verknüpfung des gesamten Dokuments nicht unbedingt zu verstehen, was den Fehler verursacht hat oder was getan werden könnte, um den Fehler zu beheben. – daspianist

+1

Die Lösung für überveröffentlichte Objekte sind die Zombies. Wenn diese Funktion aktiviert ist, wird ein Dummy-Objekt (ein Zombie) an der Stelle jedes freigegebenen Objekts gehalten, was es ermöglicht, Objekte zu debuggen, die bereits freigegeben wurden. Sehr einfach zu aktivieren: - Doppelklicken Sie auf Ihre ausführbare Datei in den "Executables" in XCode Öffnen Sie die Registerkarte "Argumente" In "Variablen in der Umgebung gesetzt werden (das ist die Liste am unteren, seien Sie vorsichtig, welche Sie bearbeiten) Klicken Sie auf die Schaltfläche "+" und geben Sie als Name der Variablen "NSZombieEnabled" und für den Wert "YES" ein. –

Verwandte Themen