5

Ich habe einige Code, der KVO schwer verwendet und haben addObserver: forKeyPath: und removeObserver: forKeyPath: an mehreren Stellen. Die App stürzt gelegentlich mit "Kann den Beobachter für den Schlüsselpfad nicht entfernen" ab.Ist es sicher, eine Ausnahme von [NSObject removeObserver: forKeyPath:] abzufangen?

Ich frage mich, ob es sicher wäre, einfach die Ausnahme zu versuchen/zu fangen, um zu verhindern, dass die App abstürzt. Ich weiß, es ist nicht der beste Ansatz beim Umgang mit KVO, aber ich muss etwas Zeit investieren, bevor ich den Code aufräumen kann.

+2

Sie sollten wahrscheinlich zuerst versuchen, die Natur der Fehler zu verstehen und entscheiden, ob Sie sie ignorieren können. Try/Catch wird helfen, wenn Sie sich dazu entscheiden: http://stackoverflow.com/questions/1582383/how-can-i-tell-if-an-object-has-a-key-value-observer-attached – Tala

Antwort

5

Ausnahmen, insbesondere von internen Apple-APIs, sollten niemals stillschweigend abgefangen und ignoriert werden. In Objective-C sollte eine Ausnahme im Allgemeinen dazu führen, dass Ihre App beendet wird, im Gegensatz zu anderen Sprachen und Laufzeiten (Java, .NET), bei denen das Abfangen von Ausnahmen ein normaler Teil der Entwicklung ist.

Wenn Sie einen Absturz haben, haben Sie einen Fehler irgendwo und Sie müssen es beheben. Das Schlucken einer Ausnahme kann ziemlich schlimme Folgen haben, da sie in einen inkonsistenten Zustand geraten. Tu es nicht.

+0

Also Ihr Empfehlung ist es, den Code aufzuräumen, auch wenn es die zusätzliche Zeit erfordert und eine Veröffentlichung verzögert? Wie ich bereits erwähnt habe, verstehe ich, dass ich meinen Code korrigieren muss. Ich versuche nur, an dieser Stelle die Ökonomie zu erarbeiten. Danke –

+1

@JihoKang Sie möchten also eine App versenden, die einen offensichtlichen Fehler hat? Weißt du überhaupt was die Auswirkungen sein werden? Gerade jetzt stürzt die App ab; Was denkst du wird deine App machen, wenn du die Ausnahme verschluckst? – Abizern

+0

@Abizern Das Projekt, an dem ich arbeite, ist ziemlich zeitkritisch und der Absturzfehler (soweit ich es bei Beta-Testern gesehen habe) tritt nur in 5% der Fälle auf. Ich habe den Code so geschrieben, dass es Fälle aufgrund von Timing-Problemen gibt, bei denen ein Objekt, das sich bereits von KVO abgemeldet hat, versucht, die Registrierung wieder aufzuheben. Ich habe versucht, den "Beobachter für Schlüsselpfad nicht entfernen" zu erkennen. Ausnahme ohne Nebenwirkungen "so weit ich sehen kann", aber fragte sich gerade, wie kritisch ein Problem sein könnte. Schließlich, wie Mike erwähnte, ist dies in Java üblich. –

3

Ja, es kann durchaus akzeptabel sein, @try @catch zu verwenden, um diese Art von KVO-Konflikten zu lösen.

Zum Beispiel:

@try { 
     [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:UIDeviceProximityStateDidChangeNotification]; 
    } 
@catch (NSException *exception) { 
     // observer doesn't exist, do nothing 
    } 

ist die Produktion sicher und wird von Apple als eine geeignete Ausnahmebehandlung Muster vorgeschlagen.

Verwandte Themen