14.6 C
New York
Monday, March 10, 2025

ios – NSObject proxy with weak delegate crashes with NSInvalidArgumentException unrecognized selector


I am debugging a library that implements a UIScrollViewDelegate proxy (basically) like:

class ScrollViewDelegateProxy: NSObject, UIScrollViewDelegate {
    non-public weak var realDelegate: UIScrollViewDelegate?

    init(scrollView: UIScrollView) {
        tremendous.init()
        self.realDelegate = scrollView.delegate
        scrollView.delegate = self
    }

    // MARK: - UIScrollViewDelegate

    // Different scroll delegate strategies...

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        // Do one thing...
        realDelegate?.scrollViewDidScroll?(scrollView)
    }

    // MARK: - Methodology Forwarding

    override func responds(to aSelector: Selector!) -> Bool {
        if let realDelegate {
            realDelegate.responds(to: aSelector)
        } else {
            tremendous.responds(to: aSelector)
        }
    }

    override func forwardingTarget(for aSelector: Selector!) -> Any? {
        if let realDelegate, realDelegate.responds(to: aSelector) {
            realDelegate
        } else {
            tremendous.forwardingTarget(for: aSelector)
        }
    }
}

The tactic forwarding is applied in case the proxy is distributed messages outdoors of UIScrollViewDelegate. E.g. if the scrollView have been a UITableView, then the delegate property could be a UITableViewDelegate with extra strategies that aren’t be immediately supported by this proxy. In that case, it ought to simply go it on.

As a result of my use case is a UITableView. I’ve discovered that this will crash (not at all times) with the error message:

'NSInvalidArgumentException', purpose: '-[SomeLibrary.ScrollViewDelegateProxy tableView:viewForHeaderInSection:]: unrecognized selector despatched to occasion'

I assume it’s because:

  • responds(to:) returns true for a selector whereas the realDelegate is in reminiscence
  • realDelegate deallocates
  • forwarding goal(for:) known as later with that selector, however it’s not applied on the proxy
  • The invocation causes a crash

I noticed this weblog submit however wasn’t certain what the Swift equal was.

Is utilizing a weak property like this with technique forwarding merely unsafe?
And what would possibly a protected implementation appear to be?

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles