Frage

Ich habe die folgende Methode:

-(void)testAPIModule {
    self.requests = [NSMutableArray array];
    NSLog(@"making arrays");
    /*(A)*/ id array1 = [NSArray arrayWithObjects:[NSNumber numberWithInt:1], [NSNumber numberWithFloat:2], nil];
    /*(B)*/ id array2 = [NSArray arrayWithObjects:[NSNumber numberWithInt:4], [NSNumber numberWithInt:5]];
    NSLog(@"made array=%@",array2);

    for( ServerRequest *req in self.requests ) {
        [Networker sendRequest:req withDelegate:self];
        [req release];
    }
}

Der Code läuft wie erwartet.

Allerdings, wenn ich Zeile aus kommentieren (A) oder die „Null“ am Ende davon entfernen, erhalte ich einen EXC_BAD_ACCESS Fehler in Zeile (B)! Nach dem Debugger, tritt der Fehler in CFRetain in dem + [NSArray arraywithobjects] Einbau-Konstruktor.

Darüber hinaus, wenn ich Zeile aus kommentieren (A) und kommentieren Sie die für (...) Schleife, der Code ausgeführt wird durch das Verfahren.

Das ist für mich sehr unerwartet. Was mache ich falsch auf der Linie (B)? Und warum sollte eine ganz andere Array auf Linie (A) zu schaffen läßt das Verfahren durchlaufen? Und warum für den nicht kommentiert aus (...) Schleife verhindern, dass der Fehler in Zeile (B), die vor ihm ist?

Kann mir jemand erklären, warum das so ist? Oder zumindest mir einen Rat geben für das Debuggen? Ich habe bereits festgestellt, dass das Verfahren nur einmal ausgeführt wird und dass „Selbst“ ist gültig.

War es hilfreich?

Lösung

Wenn die bequeme Methode mit arraywithobjects , Sie nil als letztes Element angegeben werden muss.

Dokumentation sagt:

  

arraywithobjects:

     

Erstellt und gibt einen Array die Objekte in der Argumentliste enthält.

+ (id)arrayWithObjects: (id)firstObj, ... 
     

Parameter

     

firstObj, ...
  Eine durch Kommata getrennte Liste von Objekten mit Null enden.

Andere Tipps

In -Wformat zu Ihrer Sonstige Achtung Flags und die Compiler die fehlenden Null für Sie holen.

Die zweite arbeitet nach dem ersten, weil die Elemente alle in der gleichen Position auf dem Stapel sind. So nach der Rückkehr aus dem ersten, enthält der Stapel noch einen Zeiger auf [NSNumber numberWithInt:1], einen Zeiger auf [NSNumber numberWithFloat:2] und null (und diese Zeiger sind sogar noch gültig, da der Autofreigabepool noch nicht abgelassen worden!). Wenn Sie die zweite nennen, ohne die Null, ersetzt es die Zeiger auf dem Stack, aber die Null bleibt unverändert. Wenn Ihr zweiter Versuch drei Zahlen gehabt hätte, wäre es wahrscheinlich in der gleichen Art und Weise abgestürzt, da wäre die dritte Zahl die Null überschrieben haben und dann, was nächste war, würde gelassen werden.

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