swift HandyJSON 使用注意事项(NumberofFields下crash)

3 篇文章 0 订阅

背景

HandyJSON是swift开发中常用的SON解析框架。该库由阿里巴巴技术团队研发,已经过了大量的实战积累。不再赘述。

地址:https://github.com/alibaba/HandyJSON

版本参考

针对不同的IDE环境和Swift版本,HandyJSON的版本也不一样,可以参考下表:

XcodeSwiftHandyJSON
Xcode 10Swift 4.24.2.0
Xcode 9.4.1以下Swift 4>= 4.1.1
Xcode 8.3以上Swift 3.x>= 1.8.0

 搜索版本参考如下:

-> HandyJSON (4.2.0)
   A Json Serialization & Deserialization Library for Swift
   pod 'HandyJSON', '~> 4.2.0'
   - Homepage: https://github.com/alibaba/handyjson
   - Source:   https://github.com/alibaba/HandyJSON.git
   - Versions: 4.2.0, 4.2.0-beta1, 4.1.3, 4.1.2, 4.1.1, 4.1.0, 4.0.0-beta.1, 4.0.0-beta, 1.8.0, 1.7.2, 1.7.1, 1.7.0, 1.6.1, 1.6.0, 1.5.2, 1.5.1, 1.5.0, 1.4.0, 1.3.0, 1.2.1,
   1.2.0, 1.1.0, 1.0.0, 0.4.0, 0.3.0, 0.2.0, 0.1.0 [master repo]

 

关于在NumberofFields 报错:

针对不同swift版本HandyJSON一直在更新版本,如果你的HandyJSON版本是1.8.0,swift版本大于3.3并且小于4,可能会在NumberofFields下crash,解决方法有两个:

1.修改库代码(不推荐),将如下代码:

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))
    }

修改为:(最后一行)

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))
    }

或者参考官方写法:

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
        }
        #if swift(>=4.1) || (swift(>=3.3) && !swift(>=4.0))
        return NominalTypeDescriptor(pointer: relativePointer(base: base, offset: base.pointee - base.hashValue))
        #else
        return NominalTypeDescriptor(pointer: relativePointer(base: base, offset: base.pointee))
        #endif
    }

2.如果你的swift版本大于3.3并且小于4,升级HandyJSON至对应版本: ~> 4.1.0,如果大于4.0,参照上表升级

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值