13 세 미만 아이폰 OS는 제한된 _ivar에 액세스 할 수

첫 등장 공공 호

아이폰 OS 13 전에 일반적 등의 UITextField _placeholderLabel에 대한 접근으로 개인 인스턴스 변수에 대한 액세스를 달성하기 위해 KVC를 사용하여 일반적으로 수행

extension UITextField {
    var placeholderLabel: UILabel? {
        get {
            return value(forKey: "_placeholderLabel") as? UILabel
        }
    }
}
复制代码

12까지,이 방법은 잘 아이폰 OS를 실행하지만, 아이폰 OS (13), 충돌에서 실행으로 업그레이드 :

*** 인해 캐치되지 않는 예외 'NSGenericException'응용 프로그램 종료, 이유 : UITextField에의 _placeholderLabel의 바르에 '액세스하는 행위는 금지됩니다. 이 '응용 프로그램 버그

의미 액세스 바르를 금지하는 분명하다,이은 버그 APP에 의해 발생합니다.

음, KVC는 원래의 논리를 유지하면서, 어떻게 그것을 할, 아이폰 OS (13) 적응하기 위해, 필요 사용할 수 없습니다? 이 런타임은 시도 할 수 있습니다!

extension UITextField {
    var placeholderLabel: UILabel? {
        get {
            return getIvar(name: "_placeholderLabel") as? UILabel
        }
    }
}
复制代码

실행 다시, APP는 더 이상 붕괴되지 않습니다.

getIvar 방법은 코드가 비교적 간단하다 _ivar에 액세스하기 위해 런타임을 사용, 내 패키지의 확장입니다 :

extension NSObject {
    func getIvar(name: String) -> Any? {
        guard let _var = class_getInstanceVariable(type(of: self), name) else {
            return nil
        }

        return object_getIvar(self, _var)
    }
}
复制代码

이러한 세부 사항은 아마 애플 개발자의 태도를 이해할 수 변경에서, 관리는 개발자가 깔끔하게 줄에 문서에 따라 개발, 영리하지만 쓸모 사용하지 않도록 노력하겠습니다.

그러나 수요가 아 허용하지 않습니다 ...

현재는 아이폰 OS (13)에 대해 여전히 개발자 테스트 버전, 개발자가 구덩이에 단계가 필요 후 많은있을 수 있습니다.

HTTPS : //juejin.im/post/5cfc5e975188256073337c6a 재현

추천

출처blog.csdn.net/weixin_34162629/article/details/91480108