WKWebView 子类在 dealloc 上崩溃

WKWebView subclass crashes on dealloc

当我的 WKWebView 子类 (MyWKWebView) dealloc 时,它崩溃了:

2016-05-05 15:40:08.814 MyApp[15559:202920] -[MyViewController dealloc]: In MyViewController dealloc objc[15559]: Cannot form weak reference to instance (0x7f9db7f0dbf0) of class MyWKWebView. It is possible that this object was over-released, or is in the process of deallocation.

我没有对 MyWKWebView 的弱引用,但是 MyWKWebView 本身持有对我的 UIViewController 子类 (MyViewController) 的弱引用,它拥有 MyWKWebView.

想法?

我没有意识到的一个明显重要的细节:我的 WKWebView 子类 (MyWKWebView) 符合 UIScrollViewDelegate。 (我正在尝试使 WKWebView API 与 UIWebView 兼容,以便我可以轻松地在 iOS7 和更高版本之间交换它们。)

这很重要,因为 WKWebView 已经符合 UIScrollViewDelegate,尽管 the header 中没有这样说:

#if TARGET_OS_IPHONE
WK_CLASS_AVAILABLE(10_10, 8_0)
@interface WKWebView : UIView
#else

但是,如果您查看 WKWebViewInternal.h header,我们会看到一个可疑类别:

@interface WKWebView () WK_WEB_VIEW_PROTOCOLS

如果我们进一步查看文件,我们会看到 WK_WEB_VIEW_PROTOCOLS 在 iOS:

上是 <UIScrollViewDelegate>
#if PLATFORM(IOS)
#define WK_WEB_VIEW_PROTOCOLS <UIScrollViewDelegate>
#endif

我找不到任何会明确导致过度释放的地方,但我肯定在 WKWebView 中搞砸了某些东西,因为不允许调用其正确的 UIScrollViewDelegate 方法。

解决方法是在单独的对象中实现 UIScrollViewDelegate