2010-01-06 8 views
5

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.

+0

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? –

Antwort

1

Sie können die NSAssert durch einen Testcode ersetzen, gefolgt von einer Ausnahmeerhöhung. Wenn die Assertion fehlgeschlagen ist, wird auf diese Weise eine Ausnahme ausgelöst, die vom Block @catch erfasst und im Hauptthread erneut ausgelöst wird.

Hinweis: Sie können sogar ein C-Makro definieren, um eine kompakte Form zur Verfügung zu stellen.

+0

Dies ist, was NSAssert standardmäßig tut - es löst eine NSInternalInconsistencyException. Also befürworten Sie die obige Lösung zum Catch/Re-Raise? – sickp

+0

Ich habe die Dokumentation erneut gelesen und NSAsert löst eine Ausnahme aus. Ihre aktuelle Lösung scheint also richtig zu sein. –

Verwandte Themen