WKWebView 子类在 dealloc 上崩溃

Posted

技术标签:

【中文标题】WKWebView 子类在 dealloc 上崩溃【英文标题】:WKWebView subclass crashes on dealloc 【发布时间】:2016-05-05 21:19:53 【问题描述】:

当我的 WKWebView 子类 (MyWKWebView) deallocs 时,它就这样崩溃了:

2016-05-05 15:40:08.814 MyApp[15559:202920] -[MyViewController dealloc]:在 MyViewController 中 dealloc objc[15559]:无法形成弱 引用 MyWKWebView 类的实例 (0x7f9db7f0dbf0)。这是 该对象可能被过度释放,或正在处理中 解除分配。

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

想法?

【问题讨论】:

【参考方案1】:

我没有意识到一个明显重要的细节:我的 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

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

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

【讨论】:

以上是关于WKWebView 子类在 dealloc 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

dealloc时取weakself引起崩溃

WKWebView 在 deinit 上崩溃

iOS WKWebView javascript警报在ipad上崩溃

在 iOS14 上释放 wkwebview 时,发送手势事件导致崩溃

在没有调用 viewDidLoad 的情况下调用了 Dealloc(删除 KVO 观察者时崩溃)

WKWebView崩溃iOS9