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
。
当我的 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
。