工程使用了一个 HandyJSON 的库,升级到 Swift 4.1 后 Crash 了。
1.Crash 在:
var numberOfFields: Int {
return Int(pointer.pointee.numberOfFields)
}
2.原因
- HandyJSON 应该是裁剪使用了一些 Reflection 代码。标准的 Swift Api 还没有完整反射功能的,HandyJSON 的某些接口实际上利用了 Swift 对象,没有公开的内存布局进行赋值,这种做法是一种 Hack 手段,比较危险。
3.解决办法:
- 修改代码:
var nominalTypeDescriptor: NominalTypeDescriptor? {
let pointer = UnsafePointer<Int>(self.pointer)
let base = pointer.advanced(by: nominalTypeDescriptorOffsetLocation)
if base.pointee == 0 {
// swift class created dynamically in objc-runtime didn't have valid nominalTypeDescriptor
return nil
}
return NominalTypeDescriptor(pointer: relativePointer(base: base, offset: base.pointee - base.hashValue))
}