WKScriptMessageHandler 사용 시에 add함수 자체에 문제가 있게 설계가 됐습니다.
스택오버플로우에서 찾은 방법으로 적용하니 바로 해결이 되는군요
애플의 예제코드도 그렇고 다른 예제들을 보면 addScriptMessageHandler 에 delegate를 설정할때 그냥 self를 셋합니다.
일단 복붙하여 테스트를 해보고 동작하면 넘어가고 메모리 누수를 맞이합니다.
핸들러는 델리게이트를 참조하고 웹뷰는 핸들러를 소유하면서 순환참조가 발생합니다.
하기 코드는 스크립트 핸들러로 인한 메모리 누수를 막기위한 코드입니다.
swift, objective-c 각각 적어놓겠습니다.
swift 버전
class LeakAvoider : NSObject, WKScriptMessageHandler {
weak var delegate : WKScriptMessageHandler?
init(delegate:WKScriptMessageHandler) {
self.delegate = delegate
super.init()
}
func userContentController(userContentController: WKUserContentController,
didReceiveScriptMessage message: WKScriptMessage) {
self.delegate?.userContentController(
userContentController, didReceiveScriptMessage: message)
}
}
self.wv.configuration.userContentController.addScriptMessageHandler(
LeakAvoider(delegate:self), name: "dummy")
objective-c 버전
@interface WeakScriptMessageDelegate : NSObject<WKScriptMessageHandler>
@property (nonatomic, weak) id<WKScriptMessageHandler> scriptDelegate;
- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate;
@end
@implementation WeakScriptMessageDelegate
- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate
{
self = [super init];
if (self) {
_scriptDelegate = scriptDelegate;
}
return self;
}
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
[self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];
}
@end
WKUserContentController *userContentController = [[WKUserContentController alloc] init];
[userContentController addScriptMessageHandler:[[WeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"name"];
'IT > iOs' 카테고리의 다른 글
Making iPhone ready for development 끝나지 않는 문제 (0) | 2023.07.26 |
---|---|
아이폰으로 애플 개발자 등록하기 (0) | 2023.07.25 |
아이폰 복구모드 적용 방법 (0) | 2021.07.07 |
No accounts with App Store Connect access have been found for the team App Store Connect access is required for App Store Connect distribution. (0) | 2021.03.16 |
아이폰 통신사(USIM) 정보 알아내기 (0) | 2021.03.05 |