ein Abbruch Falle bedeutet normalerweise, dass Abbruch wurde irgendwo genannt. Dies geschieht höchstwahrscheinlich, weil der Kabelbaum-Code des Einheitentests eine Ausnahme auslöst, die er nicht erwartet und einfach durch Aufruf von abort (3) behandelt. Der Abbruch-Aufruf ist nicht sehr einfach zu debuggen, weil er keine Informationen darüber liefert, wer ihn aufgerufen hat oder warum, und gibt niemals eine SIGABRT zurück. Sie könnten einen neuen Handler für SIGABRT installieren und dort einen Haltepunkt platzieren und dann zumindest den aktuellen Call-Stack untersuchen ... aber lesen Sie den Rest, um zu erfahren, warum das überhaupt passiert.
Das Problem mit Ihrem Code oben ist jedoch, dass NSInteger kein Objekttyp ist, es ist eine regelmäßige primitive. Um Ihre Fehler zu korrigieren, ersetzen die fehlerhafte Zeile mit diesem:
NSString *filter = [NSString stringWithFormat:@"id = %lld", (long long)ds.Id];
Zuerst stringWithFormat
nimmt ein NSString
Objekt als Parameter, so dass Sie das verwenden müssen Zeichen ‚@‘ zu spezifizieren, dass der Stringliteral ist ein NSString. Dies ist sehr wichtig, da @"blah blah"
tatsächlich in ein Objekt übersetzt wird. Der Aufruf, den Sie an stringWithFormat
vornehmen, erwartet, dass die NSString-Objektinformation an dieser Speicheradresse resident ist, aber stattdessen eine Zeichenfolge erhält und höchstwahrscheinlich dort explodiert. Stellen Sie sicher, dass alle Ihre Zeichenfolgenliterale @"blah blah"
sind, wo ein NSString-Typ erwartet wird und dass sie keine einfachen C-Zeichenfolgen sind.
Zweitens gibt das '@' Zeichen in der Formatzeichenfolge ein Objekt an. Da NSInteger kein Objekt ist, können Sie dieses Formatzeichen nicht verwenden. Verwenden Sie stattdessen% lld, um eine lange Long-Ganzzahl anzugeben. Schließlich müssen Sie die nil
am Ende der Parameterliste nicht hinzufügen, wenn Sie stringWithFormat
verwenden, da die Formatzeichenfolge selbst angibt, wie viele Parameter zu erwarten sind.
Der Grund, dass %lld
statt nur %d
verwendet wird, ist, dass NSInteger die Größe abhängig davon ändert, ob Sie für ein 32-Bit- oder 64-Bit-Ziel kompilieren. Durch die Förderung der NSInteger auf die long long
Art und Verwendung der %lld
Spezifizierer stellen Sie sicher, dass Sie keine Kürzungsprobleme in der Zukunft haben, wenn Sie für 64-Bit kompilieren und Ihr NSInteger-Wert mehr als 32 Bits zum Speichern benötigt.