有人知道为什么我在使用以下代码获取和设置 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/