iOS 13 下访问受限制的 _ivar

首发于公众号

在 iOS 13 之前,一般是使用 KVC 来实现访问私有的实例变量,比如要访问 UITextField 的 _placeholderLabel 一般会这么做:

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

一直到 iOS 12,这个方法运行的很好,但是升级到了 iOS 13,运行的时候就崩溃了:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug'

意思很明确,就是说禁止访问 ivar,而且这是 APP 造成的 bug。

好吧,KVC 不能用了,既要适配 iOS 13 ,又要保持原有的逻辑,怎么办呢?还有 runtime 可以一试!

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

再重新运行,APP 不再崩溃了。

getIvar 是我包装的一个扩展方法,使用 runtime 来访问 _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)
    }
}
复制代码

从这些细节变更可以大概了解苹果对于开发者的态度,官方希望开发者尽量不要使用奇技淫巧,规规矩矩按照文档开发就行了。

可是,需求不允许啊...

目前 iOS 13 还处于仅面向开发者测试的版本,作为开发者需要踩的坑之后可能还有不少。

转载于:https://juejin.im/post/5cfc5e975188256073337c6a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值