Код: Выделить всё
class ScrollViewDelegateProxy: NSObject, UIScrollViewDelegate {
private weak var realDelegate: UIScrollViewDelegate?
init(scrollView: UIScrollView) {
super.init()
self.realDelegate = scrollView.delegate
scrollView.delegate = self
}
// MARK: - UIScrollViewDelegate
// Other scroll delegate methods...
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// Do something...
realDelegate?.scrollViewDidScroll?(scrollView)
}
// MARK: - Method Forwarding
override func responds(to aSelector: Selector!) -> Bool {
if let realDelegate {
realDelegate.responds(to: aSelector)
} else {
super.responds(to: aSelector)
}
}
override func forwardingTarget(for aSelector: Selector!) -> Any? {
if let realDelegate, realDelegate.responds(to: aSelector) {
realDelegate
} else {
super.forwardingTarget(for: aSelector)
}
}
}
Потому что мой вариант использования является UITableView. Я обнаружил, что это может привести к сбою (не всегда) с сообщением об ошибке:
Код: Выделить всё
'NSInvalidArgumentException', reason: '-[SomeLibrary.ScrollViewDelegateProxy tableView:viewForHeaderInSection:]: unrecognized selector sent to instance'
- возвращает true для селектора, пока realDelegate находится в памяти
Код: Выделить всё
responds(to:)
- освобождает
Код: Выделить всё
realDelegate
- вызывается позже с этим селектором, но он не реализован на прокси-сервере.
Код: Выделить всё
forwarding target(for:)
- Вызов вызывает сбой.
Использование такого слабого свойства с переадресацией методов просто небезопасно?
/>И как может выглядеть безопасная реализация?
Подробнее здесь: https://stackoverflow.com/questions/793 ... ion-unreco