Я экспериментирую с управлением памятью в Swift следующим образом.нужна ли нам слабая или неопубликованная ссылка при выполнении ленивой переменной, управление памятью
class Person {
let name: String
//var block: (() -> Void)?
init(name: String) {
self.name = name
}
// Declare variable clone, using self inside.
private lazy var clone: String = {
return self.name
}()
deinit {
print("Destroying \(name)")
}
func doSomething() {
print("Doing something for \(name)")
}
}
var p2: Person? = Person(name: "p2")
print(p2!.clone)
p2 = nil
Как вы видите, я использую self
внутри при объявлении ленивого вара, и я думаю, что это еще хорошо, потому что, когда p2 получает ноль, я могу видеть, метод deinit
дозвонился.
Однако, если внести изменения, как следующий
// This is a closure
private lazy var clone:() -> String = {
return self.name // leaking memory is here
}
Теперь я получаю протечки памяти.
Мой вопрос предназначен для переменной, использующей ленивую инстанцирование, поэтому я не получаю утечку памяти, хотя я использую self
. Я думал, что должен использовать ее, иначе я получаю утечку памяти.
Это то, что я думал перед публикацией. Я хочу, чтобы мои мысли были правильными. Спасибо – tonytran