iOS 에서 wkwebView 메모리 누 출 및 순환 참조 문제 상세 설명

머리말
현재 대부분의 네트워크 도 wkwebview 를 불 러 옵 니 다.이전에 wkwebview 를 사용 할 때 인터넷 의 많은 기본 튜 토리 얼 을 많이 사용 합 니 다.Message Handler 를 어떻게 추가 하 는 지 말 했 을 뿐 이 메모리 가 누 출 될 위험 이 있다 는 것 을 알려 주지 않 았 습 니 다.만약 에 내부 데이터 만 호출 했 을 뿐 이 문 제 를 전혀 발견 하지 못 했 습 니 다.스 포 일 러 를 저장 하지 않 았 다 는 문 제 는 크 지 않 고 작 지 않다 고 말 합 니 다.심각 하면 바로 app 에서 물 러 나 기 때문에 중시 해 야 합 니 다.자,다음은 어떻게 해결 할 지,더 이상 말 하지 않 겠 습 니 다.상세 한 소 개 를 해 보 겠 습 니 다.
해결 방법
1.웹 페이지 의 js 상호작용 을 할 때 우 리 는 모두 이렇게 js 를 추가 합 니 다.

[self.customWebView.configuration.userContentController addScriptMessageHandler:self name:obj];
뒤에 도 delloc 가 추가 되 었 습 니 다.

- (void)dealloc {
 [_customWebView removeObserver:self forKeyPath:@"estimatedProgress"];
 [self removeScriptMessageHandler];
}
나중에 웹 페이지 를 불 러 올 때 pop push 는 여러 번 메모 리 를 작 동 하 는 것 이 계속 증가 하고 높 을 때 200 상하 가 다 되 어서 야 이 메모리 문 제 를 알 게 되 었 습 니 다.
처음에 해결 방법 은:

- (void)viewWillDisappear:(BOOL)animated {
 [super viewWillDisappear:animated];
 
 [self removeScriptMessageHandler];
}
나중에 문제 가 여전히 존재 한 다 는 것 을 알 게 되 었 습 니 다.delloc 는 여전히 가지 않 습 니 다.제거 방법 을 갔 지만 pop push 에 있 을 때 웹 페이지 는 원래 차지 하 던 메모 리 를 제거 하지 않 았 습 니 다.나중에 발견 되 었 습 니 다.

[userContentController addScriptMessageHandler:self name:GetKeyiOSAndroid_Action];
여기 userContentController 가 self 를 가지 고 있 습 니 다.그리고...
userContentController 가 configuration 에 의 해 소지 되 었 습 니 다.
최종 적 으로 웹 뷰 가 가지 고 있 습 니 다.그리고 웹 뷰 는 self 의 개인 변수 입 니 다.
그래서 self 도 self 를 가지 고 있 기 때문에 이 럴 때 반복 적 으로 인용 하 는 문제 가 존재 합 니 다.
팝 이나 dismiss 이후 에 도 메모리 가 존재 합 니 다.풀 려 나 지 않 습 니 다.
지금 두 가지 방법 이 생각 나 네요.
1.위 에서 나 는 self 가 self 를 가지 고 있 기 때문에 발생 하 는 순환 인용 문 제 를 언급 했다.
저 는 WK WebView Configuration 을 다시 만 들 었 습 니 다.

[[WKWebViewConfiguration alloc]init]; 

  userContentController =[[WKUserContentController alloc]init];       configuration.userContentController= userContentController; 

  webView = [[WKWebView alloc]initWithFrame:self.view.bounds configuration:configuration];
self 방법 을 다시 쓰 면 해결 이 돼 요.
2,delloc 메모리,

- (void)viewWillAppear:(BOOL)animated {
 [super viewWillAppear:animated];

 [_webView.configuration.userContentController addScriptMessageHandler:self name:GetKeyiOSAndroid_Action];
 [_webView.configuration.userContentController addScriptMessageHandler:self name:Upload_Action];
}

- (void)viewWillDisappear:(BOOL)animated {
 [super viewWillDisappear:animated];

 [_webView.configuration.userContentController removeScriptMessageHandlerForName:GetKeyiOSAndroid_Action];
 [_webView.configuration.userContentController removeScriptMessageHandlerForName:Upload_Action];
}
이 글:https://www.jb51.net/article/143774.htm 결국 이 문 제 를 해결 했다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기