WKWebView 子类在 dealloc 上崩溃
Posted
技术标签:
【中文标题】WKWebView 子类在 dealloc 上崩溃【英文标题】:WKWebView subclass crashes on dealloc 【发布时间】:2016-05-05 21:19:53 【问题描述】:当我的 WKWebView
子类 (MyWKWebView
) dealloc
s 时,它就这样崩溃了:
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 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章
iOS WKWebView javascript警报在ipad上崩溃
在 iOS14 上释放 wkwebview 时,发送手势事件导致崩溃