首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >objc_copyClassList:更新到iOS 13.4 / XCode 11.4后崩溃EXC_BAD_INSTRUCTION

objc_copyClassList:更新到iOS 13.4 / XCode 11.4后崩溃EXC_BAD_INSTRUCTION
EN

Stack Overflow用户
提问于 2020-03-26 00:48:25
回答 1查看 520关注 0票数 4

在更新到iOS 13.4 / XCode 11.4之后

这段代码

代码语言:javascript
运行
复制
func getSubclassInfos() -> [ClassInfo] {
    let superObject = CityModel.self
    let superClassInfo = ClassInfo(superObject)

    var subclassList = [ClassInfo]()
    var count = UInt32(0)
    guard let classList = objc_copyClassList(&count) else {
        return subclassList
    }
    for i in 0..<Int(count) {
        let clazz = classList[i] // Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
        if let classInfo = ClassInfo(classList[i]),
            let superclassInfo = classInfo.superclassInfo,
            superclassInfo == superClassInfo
        {
            subclassList.append(classInfo)
        }
    }

    return subclassList
}

在模拟器中使用EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)let clazz = classList[i]行中崩溃。

这一行不在我的原始代码中。此处显示的是下标崩溃,而不是ClassInfo(...)

你知道我能做什么吗?

(代码的灵感来自List all subclasses of one class)

EN

Stack Overflow用户

回答已采纳

发布于 2020-03-26 01:23:04

刚刚注意到:classList是一个完全错误的词。返回结果类型为AutoreleasingUnsafeMutablePointer<AnyClass>?。首先将其转换为UnsafeBufferPointer<AnyClass>,然后对其进行处理:

代码语言:javascript
运行
复制
func getSubclassInfos() -> [ClassInfo] {
    let superObject = CityModel.self
    let superClassInfo = ClassInfo(superObject)

    var count = UInt32(0)
    guard let classListPointer = objc_copyClassList(&count) else { return [] }

    return UnsafeBufferPointer(start: classListPointer, count: Int(count))
        .map(ClassInfo.init)
        .filter { $0 == superClassInfo }
}
票数 7
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60853427

复制
相关文章

相似问题

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