2017-10-14 4 views
1

Ich frage mich, ob es eine gute Praxis ist, eine deinit auf jedem View-Controller zu implementieren, um zu überprüfen, ob es korrekt entfernt wird, wenn es verschwindet und Speicherverlust zu vermeiden?Deinit ist es eine gute Praxis, es auf ViewControllern zu implementieren?

+0

Definitiv nicht für "etwas überprüfen". Auch für Controller ist es normalerweise sinnvoll, ihre eigenen Lebenszyklusmethoden zu verwenden. – Sulthan

+0

Es ist eine gute Praxis für Testing/Entwicklung/Debugging, aber nicht für die Veröffentlichung. Sobald Sie eine gute "Speicherhygiene" haben, sollten Speicherlecks selten/nicht existent werden. –

Antwort

2

standardmäßig Sie nicht haben die deinit Methode in Klassen zu implementieren:

Swift automatisch freigibt Ihre Instanzen, wenn sie nicht mehr benötigt, um Ressourcen freizugeben. Swift übernimmt die Speicherverwaltung von Instanzen durch automatische Referenzzählung (ARC), wie in Automatische Referenzzählung beschrieben. In der Regel müssen Sie keine manuelle Bereinigung ausführen, wenn Ihre Instanzen freigegeben werden. Wenn Sie jedoch mit Ihren eigenen Ressourcen arbeiten, müssen Sie möglicherweise einige zusätzliche Bereinigung durchführen. Wenn Sie beispielsweise eine benutzerdefinierte Klasse erstellen, um eine Datei zu öffnen und einige Daten darauf zu schreiben, müssen Sie möglicherweise die Datei schließen, bevor die Klasseninstanz freigegeben wird.

Schnelle Deinitialisierung Dokumentation - How Deinitialization Works Abschnitt.

Normalerweise scheint es bei der Arbeit mit View Controllern so zu sein, dass eine solche Implementierung nicht erforderlich ist. Wie jedoch im Kommentar von @rmaddy erwähnt, ist es immer noch ein Ansatz zum Verfolgen eines Speicherlecks oder eines Referenzzyklus mit dem Ansichtscontroller.

Wenn Sie überprüfen möchten, ob der Controller aus der Hierarchie entfernt wurde (siehe Controller-Lebenszyklus), können Sie die Methoden viewWillDisappear(_:) oder viewDidDisappear(_:) implementieren; Beachten Sie, dass das Aufrufen dieser Methoden nicht garantiert, dass der deinit aufgerufen wird, d. H. Es bedeutet nicht, dass das Verschwinden des Ansichtscontrollers immer dazu führt, die Zuordnung aufzuheben (bezogen: Deinit never called,).

auch:

diese Q & Wie sollte nützlich sein:

+1

tl; dr - ja, die Verwendung von 'deinit' ist eine Möglichkeit zu überprüfen, dass Sie keinen Speicherleck oder Referenzzyklus mit dem View-Controller haben. – rmaddy

+0

@rpaddy danke für den Hinweis, Antwort aktualisiert. –

1

Swift weist die Instanzen automatisch zu, wenn sie nicht mehr benötigt werden, um Ressourcen freizugeben. So deinit auf alle Ihre viewControllers hinzufügen scheint unnötig. Sie sollten deinit aufrufen, wenn Sie vor dem Freigeben eines Objekts eine Aktion oder Bereinigung ausführen müssen.

1

Gut während der Testphase ist es vielleicht eine gute Idee, weil Sie überprüfen können, ob alles gut ist (zB wenn Sie eine Menge Completion Handler haben), aber insgesamt ist es unnötig.

Verwandte Themen