2009-04-21 15 views
0

Ich spiele mit ein wenig Cocoa Apps, die ich schrieb, wo ich Objekte einer Klasse Person zu einem NSMutableArray hinzufügen. Wenn ich versuche, auf ein Objekt zuzugreifen, das außerhalb der Array-Grenze liegt, bekomme ich nur eine "beyond-bounds" -Meldung auf der Konsole.Cocoa/Objective-C Array über Grenzen Frage

In der Tat erwartete ich etwas Schlimmeres. Ich habe erwartet, dass die App abstürzt! Aber das tut es nicht.

Ich bin nicht sicher, ob das eine gute oder eine schlechte Sache ist, aber ich frage mich, was passiert in den Apps, um zu verhindern, dass es abstürzt. Ich hatte immer die Idee, auf Objekte im Speicher zuzugreifen, die nicht da sind. Normalerweise würde das jede Anwendung zerstören.

Antwort

5

In Ihrem Fall dürfen Sie nicht direkt auf beschädigten Speicher zugreifen, da Sie über das NSArray-Objekt eine Schnittstelle herstellen. Stattdessen geben Sie dem Objekt einen ungültigen Index und informieren Sie, indem Sie eine Ausnahme auslösen.

Standardmäßig führen Ausnahmen im Hauptthread einer NSApplication-Anwendung nicht dazu, dass die Anwendung beendet wird. Stattdessen protokollieren sie den Fehler und brechen den aktuellen Laufzyklus ab und starten dann den nächsten Zyklus.

Weitere Informationen dazu, wie Sie während der Debugging-Phase mit diesen Ausnahmen umgehen können, finden Sie unter this document. Es beschreibt verschiedene Techniken und Antworten, die Sie beim Umgang mit Ausnahmen auf Anwendungsebene verwenden können.

Auch das Lesen und Schreiben von schlechtem Speicher führt nicht immer zum Absturz der Anwendung, weshalb diese Art von Fehlern so schwer zu finden ist. Stattdessen könnten Sie einfach andere Objekte korrumpieren und haben keine Ahnung, dass Sie dies bis zu einem späteren Zeitpunkt im Anwendungszyklus getan haben. Das Wichtigste, an das Sie sich erinnern sollten, ist, dass NSApplication die meisten Ausnahmen, die im Hauptthread auftreten, ersticken wird. Sie müssen daher besonders darauf achten.