iOSがWKWebviewを開発し、JSとの相互作用により、現在のコントローラが破壊されない問題が発生しました.
2094 ワード
WkWebViewとJavaScriptの相互作用において、JSメッセージは常に生の中に注入されます.
WKUserContentController *userContentController = [[WKUserContentController alloc] init];
[userContentController addScriptMessageHandler:self name:@"handleGoMall"];
WKScriptMessageHandler :
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
QYLog(@"message.name:%@", message.name);
QYLog(@"message.body:%@",message.body);
// name
if ([message.name isEqualToString:@"handleGoMall"]) {//
}
}
これは予期の効果を達成することができますが、現在のコントローラを終了すると、現在のコントローラは破壊されていません.つまり、dealloc方法を実行しないということです.これはJSにhandlerを注入する時にselfを強く引用して、最終的にメモリが漏れてしまいます.解決方法:QYWeakScript Message Handlegateを作成します.@interface QYWeakScriptMessageHandlerDelegate : NSObject
@property (nonatomic, weak) id scriptDelegate;
- (instancetype)initWithDelegate:(id)scriptDelegate;
@end
@implementation QYWeakScriptMessageHandlerDelegate
- (instancetype)initWithDelegate:(id)scriptDelegate {
if (self = [super init]) {
_scriptDelegate = scriptDelegate;
}
return self;
}
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
[self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];
}
使用:はい、 [userContentController addScriptMessageHandler:self name:@"handleGoMall"];
:
[userContentController addScriptMessageHandler:[[QYWeakScriptMessageHandlerDelegate alloc] initWithDelegate:self] name:@"handleGoMall"];
最後にdeallocでリリースします.- (void)dealloc {
[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"handleGoMall"];
}
このように現在のコントローラを終了すると、現在のコントローラは破壊されます.