swift - 如何在 swift 中使用 objective-c-runtime 的 object_getIvar 和 object_setIvar?

标签 swift objective-c-runtime

有人知道为什么我在使用以下代码获取和设置 iVar 时得到 BAD_ACCESS 吗?

class myClass: NSObject {
    var model = "Unspecified"

    override init() {
        super.init()

        var key: NSString = "model"
        var aClass : AnyClass? = self
        var ivar: Ivar = class_getInstanceVariable(aClass, key.UTF8String)

        // Set
        object_setIvar(aClass, ivar, "R56")

        // Get
        var value: AnyObject = object_getIvar(aClass, ivar)
    }

}

myClass()

最佳答案

因为 Swift 类不再有传统的 iVar(尝试获取 Swift 类的 iVar 布局并亲自查看),所以您无法访问。但是 Swift 类也是运行时的 Objective-C 对象,并且似乎没有任何路径排除 Swift 类。

最后发生的事情是运行时给你一个伪造的 iVar,它真正认为指向类定义中的适当偏移量(可能是 0 左右,因为它不存在)。当您尝试获取 iVar 时,运行时字面意思是 derefs you some of the object's bytes and tries to wrap it back up in an Objective-C pointer .这些数据通常无意中设置了标记位,因此经常映射到标记类(在我的测试中,我可靠地为运行时认为是 NSMutableData 的东西取回了标记指针)。

长话短说:你不能再这样做了。

关于swift - 如何在 swift 中使用 objective-c-runtime 的 object_getIvar 和 object_setIvar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25718294/

相关文章:

ios - 关联对象与属性与实例变量之间的区别

ios - 如何在iOS swift中进行产品搜索api?

ios - CLLocationManager 在后台时不更新,并且得到困惑的位置坐标 Swift

ios - UIPickerView 奇怪的图形问题

objective-c - 使用 objc_disposeClassPair()

objective-c - 如何动态添加类方法?

ios - UiCollectionView 单元格问题

ios - 错误提示 "contains number values but got a string"

ios - Objective-C 如何检查哪些对象正在引用我的对象(保留周期)

objective-c - 如何在运行时以编程方式检测属性是否为 IBOutlet?