iOS 9~12에서 WKWebView 초기화 후 참조 개수를 조사했습니다.

6667 단어 SwiftWebKitiOS12iOS
이전 기사:
https://qiita.com/srea/items/0d935b0bad4509ddbc50
iOS 11에서는 내부의 일부 사양 변경으로 인해 강력하게 참조되는 사양이 됩니다.
이 보도는 iOS 12의 속편에서 그 부분의 규격이 어떠한지 확인했다.

WKWebView 및 UIView를 초기화한 후 웹 등록 정보 대입


인증 코드

import UIKit
import WebKit

final class ViewController: UIViewController {

    weak var wkWebView: WKWebView!
    weak var uiView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        wkWebView = WKWebView()
        print("WebView: \(CFGetRetainCount(wkWebView))")

        uiView = UIView()
        print("WebView: \(CFGetRetainCount(uiView))")
    }
}

"weak 속성이기 때문에 곧 해방될 수 있다"고 밝혔다.
보통 weak 속성을 대입하고 Print 함수로 참조 계수를 얻으면 해방되어 붕괴될 수 있습니다.
그럼 각 OS 버전의 동작을 확인하겠습니다.
어떻게 될까요?

iOS 9.3


무너졌어.정확한 동작입니다.

콘솔 로그
(lldb) 

iOS 10.3.1


무너졌어.정확한 동작입니다.

콘솔 로그
(lldb) 

iOS 11.4


무너졌어.그러나 WebView는 아직 해제되지 않은 것 같습니다. 참조 수는 2로 표시됩니다.

콘솔 로그
WebView: 2
(lldb) 

iOS 12.0


무너졌어.그러나 WebView는 아직 해제되지 않은 것 같습니다. 참조 수는 2로 표시됩니다.

콘솔 로그
WebView: 2
(lldb) 

결과 비교 표


iOS
12
11
10
9
WKWebView 초기화 시 참조 개수
2
2
0
0

WKWebView의 스토리지 차트 디버깅 기능을 사용하여 스토리지에서 확장된 객체 확인


인증 코드

import UIKit
import WebKit

final class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let webView = WKWebView()
        print("WebView: \(CFGetRetainCount(webView))")
    }
}

iOS 9.3


WebKit (43)

iOS 10.3.1


WebKit (48)

iOS 11.4


WebKit (53)

iOS 12.0


WebKit (2)
WebKit (55)

총결산

  • iOS 12의 내부 구성에서도 차이가 있음
  • 결론

  • 잘 모르겠지만 iOS 11부터 WKWebView가 WebKit 시스템에서 강력하게 참고됐나요?
  • 원형 참조가 발생하지 않으므로 ViewController 속성에서 강력한 참조는 문제가 없습니다.
  • 완전히 한담하다


    iOS 12에서 JS를 통해 통신할 수 없는 evaluateJavascript 현상을 확인 중입니다.
    조건으로 삼다
    - 실제 시스템(Simulator Mobility)
    - WKWebView는 JS에서만 사용
    - WKWebView가 AddSubview 또는 AddSubview를 실행하지 않은 경우에도 ViewController는 인스턴스 유지에만 사용되며 표시에는 사용되지 않습니다.
    이 경우 WKWebView를 프레임 제로 AddSubview로 이동합니다.
    Original

    좋은 웹페이지 즐겨찾기