Ich versuche, NSAssert
in meiner gesamten iPhone-App zu verwenden, so dass, wenn eine unerwartete Bedingung auftritt, die Anwendung fehlschlägt-schnell und stürzt mit einer sinnvollen Nachricht im Absturzprotokoll ab.NSAsssert Verwendung in Threads
Dies funktioniert einwandfrei, wenn der Fehler NSAssert
auf dem Hauptthread ist, da es standardmäßig NSInternalInconsistencyException
erhöht, die nicht abgefangen wird und die Ausführung stoppt. Aber ich mache auch die Verarbeitung in Hintergrundthreads, in diesem Fall bricht der NSAssert
nur den Thread ab, aber die Programmierung läuft weiter.
Meine aktuelle Lösung ist die Ausnahme im Hauptthread zu fangen und erneut auslösen (in diesem Fall NSOperation
‚s main
Methode):
- (void)main {
@try {
int x = 14;
...
NSAssert1(x > 20, @"x should be greater than 20, was %d", x);
...
}
@catch (NSException *e) {
[e performSelectorOnMainThread:@selector(raise) withObject:nil waitUntilDone:YES];
}
}
Gibt es einen besseren Weg? Vielleicht einen benutzerdefinierten NSAssertionHandler verwenden?
Ich weiß, ich könnte nur Cs verwende assert
mit einer statischen Anmerkung:
assert(x > 20 && "x should be greater than 20");
Aber das mir nicht erlaubt, zu zeigen, was der tatsächliche andernfalls Wert von x
ist.
Ich habe das gleiche Problem, aber die vorgeschlagene Lösung wird nicht für mich arbeiten. Der NSAsssert wird ausgelöst, der Thread stirbt, aber die App läuft weiter. Ich benutze die Cocos2D-Engine. Könnte jemand eine vollständigere Lösung bieten? –