Объект не освобождается со слабой ссылкой

#ios #swift

Вопрос:

У меня есть класс, владеющий свойством со слабой ссылкой, когда все сильные ссылки на это свойство нарушены, оно не освобождается.

Вот код для воспроизведения этой проблемы.

import WebKit

Вставьте этот код в AppDelegate#didFinishLaunchingWithOptions ,

          
        class NavigationDelegate: NSObject, WKNavigationDelegate {
            
        }
        class DelegateWrapper {
            weak var delegate: AnyObject?
            init(webView: WKWebView?) {
                self.delegate = webView?.navigationDelegate
            }
            
            init(delegate: AnyObject?) {
                self.delegate = delegate
            }
        }
        // create a delegate with strong reference.
        var delegate: NavigationDelegate? = NavigationDelegate()
        let webView = WKWebView()
        // add a weak reference to delegate
        webView.navigationDelegate = delegate
//        let wrapper = DelegateWrapper(delegate: delegate)
        // add a weak reference to `webView.navigationDelegate`
        let wrapper = DelegateWrapper(webView: webView)
        // break the strong reference.
        delegate = nil
        // it prints "Navigation delegate should be nil false"
        print("Navigation delegate should be nil (wrapper.delegate == nil)")
       
 

Как вы можете видеть из кода, когда я звоню delegate = nil , не должно быть сильных ссылок, указывающих на этого делегата, но wrapper.delegate это не ноль.

С другой стороны, если я создам DelegateWrapper с DelegateWrapper(delegate: delegate) , то wrapper.delegate это ноль.

Кто-нибудь знает, почему это произошло?