Сохранение ссылки на объект при создании и сохранении замыкания

У меня есть вопрос о том, как ссылки на объекты обрабатываются в замыканиях в конкретном примере. Код ниже упрощен, чтобы продемонстрировать идею

class SomeObject {
    init(value: Int) {
        self.value = value
    }
    var value: Int {
        didSet {
            valueObservers.forEach { $0(value) }
        }
    }
    var valueObservers = [(Int) -> Void]()
}

class TestClass {

    let obj1 = SomeObject(value: 1)
    let obj2 = SomeObject(value: 2)
    let obj3 = SomeObject(value: 3)

    func valueOfObjectChanged(object: SomeObject) {
        print("Value of object \(object) is \(object.value)")
    }

    init() {
        let objects = [obj1, obj2, obj3]
        objects.forEach { (object) in
            object.valueObservers.append { [unowned self] (_) in
                self.valueOfObjectChanged(object: object)
            }
        }
    }
}

Итак, у нас есть класс SomeObject который может хранить массив замыканий, которые будут выполняться при изменении значения его переменной. TestClass создает несколько из этих объектов, затем создает массив из этих объектов, и для каждого объекта в этом массиве он добавляет замыкание, которое будет выполнять функцию TestClass когда значение любого из них SomeObjects изменения.

Хорошо, теперь внутри этой функции, которая может быть вызвана любым из созданных объектов, я хочу быть уверенным, что знаю, какой объект действительно вызвал его выполнение. Ссылка передается при выполнении функции, но обратите внимание, что object здесь get из цикла и передается в замыкание (замыкание, которое выполнит valueOfObjectChanged и передаст ссылку на объект в качестве параметра).

В чем проблема с этим - я не уверен, будет ли ссылка на объект на самом деле сохранена для правильного объекта, так как это замыкание выполняется где-то совершенно иначе, чем при создании замыкания.

Я не могу поставить object в этом закрытии capture listпотому что это вызывает Segmentation fault: 11,

Я не уверен, как замыкание будет вести себя в этой ситуации - будет ли ссылка на объект сохранена, или это может быть неправильно?

Я также мог бы добавить вызывающего в определение valueObservers, но это то, что я хотел бы избежать из-за текущей структуры приложения (пример является лишь упрощением).

Так что мой вопрос - это ссылка на object под object.valueObservers.append всегда корректно и указывает на объект, который изменил его значение или неверно, и, например, указывает на последний объект, который был повторен в objects.forEach или еще что то?

0 ответов

Другие вопросы по тегам