Я использую новый блочный KVO API в Swift для наблюдения за свойствами. Ниже приведен пример кода.
class A: NSObject {
var observerA: NSKeyValueObservation? = nil
var observerB: NSKeyValueObservation? = nil
var property1: CustomObj1?
var property2: CustomObj2?
func doSomething() {
}
func doSomethingElse() {
}
func observeValues() {
observerA = customObj1.observe(\.property1, options: [], changeHandler: { [weak self] (obj, change) in
guard let strongSelf = self else { return }
strongSelf.doSomething()
strongSelf.observerB = customObj2.observe(\.property2, options: [], changeHandler: { [weak strongSelf] (nestedObj, nestedChange) in
guard let nestedStrongSelf = strongSelf else { return }
nestedStrongSelf.doSomethingElse()
})
})
}
}
Мой вопрос в том, как мы ссылаемся на self
во внутреннем блоке обработчика изменений. Я мог бы использовать его, как указано выше, и я не вижу утечек памяти. Но использование self
вместо strongSelf
в «[weak strongSelf]» внутри внутреннего обработчика изменений также не вызывает никаких проблем. Вот код.
func observeValues() {
observerA = self.observe(\.property1, options: [], changeHandler: { [weak self] (obj, change) in
guard let strongSelf = self else { return }
strongSelf.doSomething()
strongSelf.observerB = strongSelf.observe(\.property2, options: [], changeHandler: { [weak self] (nestedObj, nestedChange) in
guard let nestedStrongSelf = self else { return }
nestedStrongSelf.doSomethingElse()
})
})
}
Мой вопрос заключается в том, как следует ссылаться на self
во вложенных обработчиках завершения и что в этом должно быть наилучшей практикой. Спасибо.
[unowned self]
, чтобы справиться с этой ситуацией. - person matt   schedule 22.10.2018[weak self]
, поскольку вы обнаружили, что это не вызывает проблем? - person OOPer   schedule 23.10.2018strongSelf
для лучшей читабельности. - person Swift Technocrat   schedule 23.10.2018