Warum bekomme ich Fehler EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) wenn ich mit GCD

Konnte jemand, bitte, erklären Sie mir warum bekomme ich Fehler EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) in dispatch_semaphore_wait in den folgenden code:

-(void) initialize {
  dispatch_queue_t queue = dispatch_queue_create("My queue", NULL);
  dispatch_semaphore_t sem = dispatch_semaphore_create(1);
  self.queue = queue;
  self.sem = sem;
  self.myarray = [[NSMutableArray alloc]init];
  [self.myarray addObject: [[MyObject alloc] init]];
}
-(MyObject *) method1 {
  //do something
  dispatch_semaphore_wait(self.sem, DISPATCH_TIME_FOREVER);
  MyObject *obj = [self.myarray objectAtIndex:0];
  dispatch_barrier_sync(self.queue, ^{
    [self.myarray removeObjectAtIndex:0];
  });
  return obj;
}

-(void) method2:(MyObject *)object {
  //do something
  dispatch_barrier_async(self.queue, ^{
    [self.myarray addObject:object];
    dispatch_semaphore_signal(self.sem);
  });
}

Fand ich ähnliche Frage Warum funktioniert dieser code Ursache "EXC_BAD_INSTRUCTION"?, aber in meinem Fall bin ich mit der ARC und ich Schreibe nicht explizit nirgendwo dispatch_release(sem);

Wie ist die "Warteschlange" definiert? Klar das man in-Initialisierung ist nicht das gleiche.
die gleichen, die ich vergaß zu hinzufügen von code, weist lokalen Variablen zu Instanz-Variablen
Also... äh... haben Sie noch das problem jetzt, dass Sie behoben haben Sie den code? Denn wenn das behoben deinen code, dann sollten Sie die Antwort akzeptieren, nicht Bearbeiten Sie die Frage zu machen, sinnlos.
Ich habe nicht den code ändern, ich bearbeitet habe, nur einige Tippfehler und Ungenauigkeiten nur im text, den ich hier gepostet. Jetzt ist der code hier ist der code, den habe ich im Programm. Die Antwort ist also NEIN, es hat nicht das problem zu beheben.
Sind Sie sicher, dass die Instanz-Methode initialize wurde aufgerufen, bevor Sie senden method1 und Methode method2? Überprüfen Sie, ob der semaphore und Warteschlangen ivar ist nicht nil ist, bevor Sie es verwenden, z.B. assert(self.sem). Auch Ihr code macht, nicht munch Sinn. Ihre Nutzung der semaphore ist auch nicht richtig, dass es nicht zu verhindern, um den Zugriff auf das array selbst, wenn es leer ist, so erhalten Sie eine Ausnahme.

InformationsquelleAutor zyxel | 2013-08-01

Schreibe einen Kommentar