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"];
}
このように現在のコントローラを終了すると、現在のコントローラは破壊されます.