Класс Parent
ниже имеет сильные и слабые ссылки на один дочерний объект. Дочерний объект никогда не освобождается. Уберите слабую ссылку, и ребенок освободится.
Вызов метода Mirror
необходим для этой утечки, но я не могу понять, почему использование зеркала может вызвать такое поведение. Результаты Зеркала не сохраняются.
При работе со слабыми и сильными реферами выполняется только родительский деинит!
Parent deinit
Я ожидаю увидеть освобождение обоих родительских и дочерних объектов, поэтому в журнале будет указано:
Parent deinit
DeinitLogger deinit
Удалите слабую ссылку, и журнал показывает оба объекта deinit, как и ожидалось.
Можете ли вы помочь мне понять, почему это происходит? (Это не игровая площадка, а приложение).
class DeinitLogger {
deinit {
print("DeinitLogger \(#function)")
}
}
class Parent: NSObject {
weak var weakLogger: DeinitLogger?
var strongLogger: DeinitLogger
override init() {
let logger = DeinitLogger()
// Create a weak ref
weakLogger = logger // comment out this line, no leak!
// Create a strong ref to same object.
strongLogger = logger
super.init()
// Invoking mirror and adding the properties to a dict leaks when one of the
// properties is weak.
let dict = dictionaryOfProps()
print(dict)
}
deinit {
print("Parent \(#function)")
}
/// Generates a dictionary of property names -> properties
/// e.g. "strongLogger" -> type of strongLogger.
private func dictionaryOfProps() -> [String: Any] {
var result = [String: Any]()
let mirror = Mirror(reflecting: self)
for case let(label?, value) in mirror.children {
result[label] = value
}
return result
}
}
// Chuck these two lines in a viewDidLoad(), or anywhere.
var o: Parent? = Parent()
o = nil // everything should be freed here.