Прокси-сервер NSObject со слабым делегатом аварийно завершает работу с нераспознанным селектором NSInvalidArgumentExceptIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Прокси-сервер NSObject со слабым делегатом аварийно завершает работу с нераспознанным селектором NSInvalidArgumentExcept

Сообщение Anonymous »

Я отлаживаю библиотеку, которая реализует прокси-сервер UIScrollViewDelegate (по сути), например:

Код: Выделить всё

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)
}
}
}
Переадресация метода реализована в случае, если прокси отправляет сообщения за пределы UIScrollViewDelegate. Например. если бы ScrollView был UITableView, то свойство Delegate было бы UITableViewDelegate с большим количеством методов, которые не поддерживаются напрямую этим прокси. В этом случае его следует просто передать.
Потому что мой вариант использования является UITableView. Я обнаружил, что это может привести к сбою (не всегда) с сообщением об ошибке:

Код: Выделить всё

'NSInvalidArgumentException', reason: '-[SomeLibrary.ScrollViewDelegateProxy tableView:viewForHeaderInSection:]: unrecognized selector sent to instance'
Я думаю, что это потому, что:
  • Код: Выделить всё

    responds(to:)
    возвращает true для селектора, пока realDelegate находится в памяти
  • Код: Выделить всё

    realDelegate
    освобождает
  • Код: Выделить всё

    forwarding target(for:)
    вызывается позже с этим селектором, но он не реализован на прокси-сервере.
  • Вызов вызывает сбой.
Я видел эту запись в блоге, но не был уверен, что такое эквивалент Swift.
Использование такого слабого свойства с переадресацией методов просто небезопасно?
/>И как может выглядеть безопасная реализация?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ion-unreco
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»