如何使用objective-c-runtime';s object_getIvar&;swift中的对象_setIvar?
有人知道为什么我在使用以下代码获取和设置IVAR时无法访问吗如何使用objective-c-runtime';s object_getIvar&;swift中的对象_setIvar?,swift,objective-c-runtime,Swift,Objective C Runtime,有人知道为什么我在使用以下代码获取和设置IVAR时无法访问吗 class myClass: NSObject { var model = "Unspecified" override init() { super.init() var key: NSString = "model" var aClass : AnyClass? = self var ivar: Ivar = class_getInstanceVa
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,运行时字面上。通常,这些数据无意中设置了标记位,因此经常映射到标记类(在我的测试中,我可靠地得到了运行时认为是NSMutableData的标记指针)
长话短说:你不能再这样做了。第一个问题是你应该将
self
作为第一个参数传递给object\u setIvar
和object\u getIvar
,但之后它仍然崩溃/表现出奇怪的行为。我怀疑有一个bug。只要阅读这篇文章,它就非常有意义,解释了为什么我的DI框架在swift类中设置IVAR时遇到问题。我的问题是。如果我想在swift类中设置内部变量。我怎么做?在Objective-C中,我可以声明并设置一个内部变量,这有助于保持接口干净。我现在必须将所有内容作为属性公开吗?那太糟糕了-(