如何使用objective-c-runtime';s object_getIvar&;swift中的对象_setIvar?

如何使用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

有人知道为什么我在使用以下代码获取和设置IVAR时无法访问吗

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中,我可以声明并设置一个内部变量,这有助于保持接口干净。我现在必须将所有内容作为属性公开吗?那太糟糕了-(