mehr frei ist Wenn Sie nur Methoden auf self
aufrufen werden, wenn die Schließung wird aufgerufen, dann müssen Sie nicht einmal if let
, guard let
oderverwenden. Der Code unten funktioniert auch ganz gut, die Methoden zu nennen, wenn self
nicht gleich Null ist, und nichts zu tun, wenn er:
RESTApi.fetchUser() { [weak self] in
self?.items.append(stuff)
self?.whatever()
}
Dieses bedingte Abwickeln in allen Fällen, außer denen, verwendbar ist, wo Sie brauchen self
oder passieren Eigenschaft von self
als ein Argument zu einem nicht-optionalen Funktionsparameter, oder weisen Sie self
oder eine Eigenschaft von self
zu einer Variablen mit einem nicht-optionalen Typ zu.
Als eine breitere Anmerkung, es gibt nicht unbedingt eine Notwendigkeit, self
in diesem Szenario sowieso schwach zu machen. Das wird normalerweise nur benötigt, wenn self
die Schließung beibehält, die self
innerhalb als ein ivar referenziert (Kreisreferenz). In Ihrem Fall ist es RestApi
, die einen Verweis auf die Schließung enthält, und der View-Controller, den self
bezieht, würde von der Schließung beibehalten, bis die Schließung zurückgegeben wird. An diesem Punkt, wenn der View-Controller vom Benutzer bereits zurückgewiesen wurde und die Referenz des Closings die letzte Referenz darauf war, wird sie nach dem Abschluss des Closings aufgehoben (keine zirkuläre Referenz).
So schwach self
in diesem Beispiel nur gilt, wenn Sie speziell das Szenario des Verweigerns des View-Controllers, um die Instanz freigeben möchten, und die Schließung, um dann überhaupt nichts auszuführen.
Wird die Datei nicht selbst erfasst, so dass es keine Rolle spielt, ob der Benutzer zurückkehrt, bevor die REST-API beendet wurde? – ryantxr
Ich bin mir nicht sicher. Ich verwende immer [schwaches Selbst], wenn es um ViewControllers geht. Kann sonst noch jemand dazu Stellung nehmen? – TIMEX
Es scheint ein gemeinsames Muster zu sein. Ich denke, wenn Sie es nicht schwach machen, kann das eingefangene Selbst einen Referenzzyklus einführen und die Speicherverwaltung durcheinander bringen. – Thilo