Я тестировал быстрое закрытие с игровой площадкой Xcode.
Это мой код:
import UIKit
class A{
var closure: ()->() = {}
var name: String = "A"
init() {
self.closure = {
self.name = self.name + " Plus"
}
}
deinit {
print(name + " is deinit")
}
}
var a: A?
a = A()
a = nil
Как и ожидалось, a является самодостаточным замыканием, поэтому a никогда не освобождается.
Но когда я добавляю эту строку перед последней строкой:
a?.closure = { a?.name = "ttt" }
Затем я обнаружил в окне вывода «A is deinit», что означает, что a выпущен. Почему? не перерабатывает ссылку?
Для тестирования я использую функцию для установки закрытия, код которой имеет версию 2:
import UIKit
class A{
var closure: ()->() = {}
func funcToSetClosure(){
self.closure = { self.name = "BBB"}
}
var name: String = "A"
init() {
self.closure = {
self.name = self.name + " Plus"
}
}
deinit {
print(name + " is deinit")
}
}
var a: A?
a = A()
a?.funcToSetClosure()
a = nil
Опять же, a никогда не освобождается.
Итак, я пришел к выводу, что когда закрытие устанавливается с помощью init или функции в классе, это вызывает ссылку на переработку, когда она устанавливается вне класса, она не вызывает ссылку на переработку. Я прав?