#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
это ноль.
Кто-нибудь знает, почему это произошло?