Schnell, wie viel von "Selbst" machen Schließungen? - schnelle, Verschlüsse

Ich bin verwirrt von dieser Situation:

  1. Klasse A übergibt eine flüchtige Schließung Z an eine globale Warteschlange.

  2. In der Schließung Z rufen wir Funcs in Klasse A und Klasse B auf, die nur von Klasse A referenziert werden.

  3. Kurz vor Schließung ruft Z Funktionen aus Klasse B auf, Klasse B wird bereinigt.

  4. Was bedeutet Klasse B an diesem Punkt für den Abschluss Z? Ist es immer noch das alte B zur Zeit der Eroberung oder das neue Nichts? (Angenommen, B war ein Delegierter)

==

Eine weitere Folgefrage wäre, wenn die Funktionen der Klasse B, die von Schließung Z aufgerufen werden, mehr Dinge in Klasse B referenzieren, wie wird das "Selbst" von B erfasst, ist es stark oder schwach?

Meine Verwirrung kommt, weil ich in Schließung Z, [schwaches Selbst] angeben kann, aber ich kann das nicht für die Funktionen tun, die ich in Klasse B aufrufen möchte.

Antworten:

1 für die Antwort № 1

Klasse B, die nur von Klasse A referenziert wird

Ich nehme an, du meinst sowas in A:

var objB: B?

Kurz vor Schließung ruft Z Funktionen aus Klasse B auf, Klasse B wird bereinigt.

Nun, es gibt nur einen Weg, um sauber zu machen B:

objB = nil

Wenn Sie jetzt Bs Methoden in der Closure aufrufen, erhalten Sie eine "unerwartete Null gefunden, während Sie einen optionalen Wert auspacken".

Dies liegt daran, dass Sie nur erfasst haben self, welches ist A in der Schließung. Du hast nicht gefangen genommen B überhaupt. Die Instanz von B wird durch die starke Referenz von beibehalten A. Grundsätzlich gilt, B wird nicht von der Schließung erfasst.

Meine Verwirrung kommt, weil ich in Schließung Z, [schwaches Selbst] angeben kann, aber ich kann das nicht für die Funktionen tun, die ich in Klasse B aufrufen möchte.

Also du kann Erfassung B obwohl. Genau wie dieser:

[b = self.objB] in ...

Sie können es auch schwach machen:

[weak b = self.objB] in ...

Auf diese Weise können Sie auch B im Verschluss erfassen.


1 für die Antwort № 2

and class B who is only referenced from class A.

Das bedeutet entweder zwei Dinge:

  1. B Instanz ist eine starke Eigenschaft und wird nicht mindestens bis veröffentlicht A Instanz wird freigegeben, und A Instanz wird nicht bis zum Ende der Schließung freigegeben werden.

  2. B Instanz ist eine schwache Eigenschaft und kann jederzeit freigegeben werden (A Instanz hat in diesem Fall nichts zu sagen). Aber es bedeutet gleichzeitig B Instanz muss optional sein, daher wird der Compiler Sie zwingen, das Szenario richtig zu behandeln, in dem es freigegeben wird (natürlich können Sie es auspacken, aber dann ist es Ihr Problem).


Speisekarte