Warum verursacht "try catch" in Objective-C Speicherverlust?

8

Ich denke über Vor- und Nachteile von Try-Catch in Objective-C nach. Nach diesem Artikel NSException Mythen in iOS zu zerstreuen: Können wir @ try ... @ catch, @finally? verwenden, ist Try-Catch nicht so schlimm, außer dass es Speicher in ARC verliert.

>

Wie kann try-catch Speicherverlust verursachen?

    
allenlinli 26.11.2014, 03:34
quelle

1 Antwort

13

Zunächst einmal: Ausnahmen haben unterschiedliche Semantiken in Objective-C. Eine Ausnahme bedeutet, dass etwas aufgrund eines Programmierfehlers komplett fehlgeschlagen ist und die weitere Ausführung der Anwendung nicht sinnvoll ist. Beende es! Um "erwartete Fehler" (wie unzureichende Benutzereingaben oder nicht reagierende Server usw.) zu behandeln, verwenden Sie das Cocoa-Fehlerbehandlungsmuster . (Der Grund dafür ist, dass Ausnahmen in vielen Situationen nützlich sind, aber in anderen Situationen sehr schwierig zu handhaben sind, z. B. während der Konstruktion von Objekten. Lesen Sie über Ausnahmen in C ++. Es ist schmerzhaft.)

Zu Ihrem Q: ARC fügt zusätzlichen Code für die Speicherverwaltung hinzu. Dieser Code muss ausgeführt werden, um die Speicherverwaltung zu übernehmen, insb. Objekte freigeben. Wenn zuvor eine Ausnahme auftritt, erreicht der Kontrollfluss niemals die Freigabeanweisung. Speicherlecks.

%Vor%

Wenn Sie eine Ausnahme haben, wird die Methode sofort verlassen und der ARC-Code und das Ende der Methode, um das Objekt freizugeben, werden niemals ausgeführt. Das ist das Leck.

Sie können dieses Verhalten ändern, indem Sie die Quelle mit -fobjc-arc-exceptions -Option kompilieren.

Ссылка

Dies wird Code hinzufügen, um ARC exception-safe zu machen, was zu einer Laufzeitstrafe führt. Aber es gibt wenig Grund, dies in der Kakao-Entwicklung zu tun, wie am Anfang dieser Antwort erklärt.

    
Amin Negm-Awad 26.11.2014, 05:57
quelle