首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在swift中使用objective-c-runtime的object_getIvar和object_setIvar?

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

Stack Overflow用户
提问于 2014-09-08 14:09:58
回答 1查看 1.5K关注 0票数 5

有人知道为什么我用下面的代码获取和设置我的iVars时会得到BAD_ACCESS吗?

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2014-11-17 14:13:47

因为Swift类不再有传统的iVars,所以你得到了一个糟糕的访问权限(尝试获取一个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的标记指针)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25718294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档