Сохранение ссылки на объект при создании и сохранении замыкания
У меня есть вопрос о том, как ссылки на объекты обрабатываются в замыканиях в конкретном примере. Код ниже упрощен, чтобы продемонстрировать идею
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
или еще что то?