在更新到iOS 13.4 / XCode 11.4之后
这段代码
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)
发布于 2020-03-26 01:23:04
刚刚注意到:classList
是一个完全错误的词。返回结果类型为AutoreleasingUnsafeMutablePointer<AnyClass>?
。首先将其转换为UnsafeBufferPointer<AnyClass>
,然后对其进行处理:
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 }
}
https://stackoverflow.com/questions/60853427
复制相似问题