Сильные, слабые ссылки + Зеркало: утечка - PullRequest
0 голосов
/ 08 января 2019

Класс 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.

1 Ответ

0 голосов
/ 09 января 2019

Это известная ошибка в Swift 4.2 (Xcode 10):

вызвано отсутствующим выпуском при чтении слабой ссылки в ReflectionMirror.m . Ошибка была исправлена ​​в основной ветке. Ваша программа работает правильно с текущим снимком «Разработка магистрали (мастер)» из https://swift.org/download/#releases.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...