Frage

Ich versuche, einen Prozess im Hintergrund laufen zu lassen um eine Zeichenfolge zu erzeugen, die dann im Hauptthread verwendet wird (zu einem Remote-Server gesendet.) Der Code Fein im Simulator funktioniert, und der String angemeldet ist doppelt so erwartet.

Auf einem Gerät (iPad, 4.2 und verschiedene iPhones) stürzt jedes Mal mit EXC_BAD_ACCESS. Es scheint, dass myString Gültigkeitsbereich verlässt, aber dies scheint gegen das Beispiel zu gehen auf Wikipedia wo das gleiche Prinzip verwendet wird.

Der Code ist wie folgt:

dispatch_async(_queue, ^{

 NSString *myString = [self generateString];
 NSLog(@"1 String is %@", myString);
 dispatch_async(dispatch_get_main_queue(), ^{
  NSLog(@"2 String is %@", myString);
 });

});

Wer weiß, warum diese Abstürze, und der beste Weg, um es zu beheben?


machte ich den Fehler meinen Code zu vereinfachen meine Frage klar zu halten.

Auf der Hauptwarteschlange ich eigentlich Nachricht selbst mit einem anderen Gespräch, und dies bewirkt, dass der schlechten Zugang.

Die Lösung war die Methode auf meiner async Warteschlange aufrufen, und innerhalb der Methode wickeln den Code in der dispatch_async (dispatch_get_main_queue () ^ {}); Block.

Dies wird hoffentlich helfen jemand anderes.

War es hilfreich?

Lösung

machte ich den Fehler meinen Code zu vereinfachen meine Frage klar zu halten.

Auf der Hauptwarteschlange ich eigentlich Nachricht selbst mit einem anderen Gespräch, und dies bewirkt, dass der schlechten Zugang.

Die Lösung war die Methode auf meiner async Warteschlange aufrufen, und innerhalb der Methode wickeln den Code in der dispatch_async (dispatch_get_main_queue () ^ {}); Block.

Dies wird hoffentlich helfen jemand anderes.

Andere Tipps

Meine Vermutung wäre, dass der NSString ist ein Autorelease-Objekt so wird es von Umfang hinausgehen und freigegeben, bevor es in der Hauptwarteschlange Codeblock verwendet wird. Versuchen Sie, behalten / Freisetzung in die NSString:

dispatch_async(_queue, ^{

 NSString *myString = [self generateString];
 [myString retain];
 NSLog(@"1 String is %@", myString);
 dispatch_async(dispatch_get_main_queue(), ^{
  NSLog(@"2 String is %@", myString);
  [myString release];
 });

});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top