工程使用了一個 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))
}