繁体   English   中英

NSCoding仅在64位设备上编码崩溃

[英]NSCoding crash on encode only on 64bit devices

我有一个带有2个自定义数据结构的应用程序,其中1个名为PaxData,另一个为ManifestData,基本上,ManifestData包含一个PaxData数组。

现在一切正常,然后我实施了NSCoding以拥有永久存储。 我将其添加到我的PaxData和ManifestData文件中。 然后我在iPhone 4S的模拟器上试用了它,效果很好。 然后尝试使用iPad Air ...在此崩溃:

aCoder.encodeObject(manifestPax, forKey: PropertyKey.manifestPaxKey)

我的错误:线程1:EXC_BAD_ACCESS(code = EXC_I386_GPFLT)

现在我的manifestPax是=到[PaxData]

崩溃之后,我开始进行挖掘,尝试寻找解决方案,最终我发现我的应用程序总是在64位设备上崩溃,每次我在非64位(4s-5-iPad 2)上运行它时,它都能正常工作!

所以现在,我没主意了。任何帮助将不胜感激。

这是我的ManifestData.swift文件的更多内容:

init?(date: NSDate, pilotName: String, acReg: String, manifestPax: [PaxData]) {

    self.date = date
    self.pilotName = pilotName
    self.acReg = acReg
    self.manifestPax = manifestPax

    super.init()

    if pilotName.isEmpty || acReg.isEmpty || manifestPax.isEmpty {
        return nil
    }

}

// MARK : NSCoding

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(date, forKey: PropertyKey.dateKey)
    aCoder.encodeObject(pilotName, forKey: PropertyKey.pilotNameKey)
    aCoder.encodeObject(acReg, forKey: PropertyKey.acRegKey)
    aCoder.encodeObject(manifestPax, forKey: PropertyKey.manifestPaxKey)
}

required convenience init?(coder aDecoder: NSCoder) {
    let date = aDecoder.decodeObjectForKey(PropertyKey.dateKey) as! NSDate
    let pilotName = aDecoder.decodeObjectForKey(PropertyKey.pilotNameKey) as! String
    let acReg = aDecoder.decodeObjectForKey(PropertyKey.acRegKey) as! String
    let manifestPax = aDecoder.decodeObjectForKey(PropertyKey.manifestPaxKey) as! [PaxData]

    self.init(date: date, pilotName: pilotName, acReg: acReg, manifestPax: manifestPax)
}

编辑:这是PaxData.swift:

init?(paxName: String, paxWeight: String, paxEmergencyName: String, paxEmergencyPhone: String, paxDestinationComments: String) {

    self.paxName = paxName
    self.paxWeight = paxWeight
    self.paxEmergencyName = paxEmergencyName
    self.paxEmergencyPhone = paxEmergencyPhone
    self.paxDestinationComments = paxDestinationComments

    super.init()

    if paxName.isEmpty || paxWeight.isEmpty || paxEmergencyName.isEmpty || paxEmergencyPhone.isEmpty || paxDestinationComments.isEmpty {
        return nil
    }

}
// MARK : NSCoding

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(paxName, forKey: PropertyKey.paxNameKey)
    aCoder.encodeObject(paxWeight, forKey: PropertyKey.paxWeightKey)
    aCoder.encodeObject(paxEmergencyPhone, forKey: PropertyKey.paxEmergencyPhoneKey)
    aCoder.encodeObject(paxEmergencyName, forKey: PropertyKey.paxEmergencyNameKey)
    aCoder.encodeObject(paxDestinationComments, forKey: PropertyKey.paxDestinationCommentKey)
}

required convenience init?(coder aDecoder: NSCoder) {
    let paxName = aDecoder.decodeObjectForKey(PropertyKey.paxNameKey) as! String
    let paxWeight = aDecoder.decodeObjectForKey(PropertyKey.paxWeightKey) as! String
    let paxEmergencyName = aDecoder.decodeObjectForKey(PropertyKey.paxEmergencyNameKey) as! String
    let paxEmergencyPhone = aDecoder.decodeObjectForKey(PropertyKey.paxEmergencyPhoneKey) as! String
    let paxDestinationComments = aDecoder.decodeObjectForKey(PropertyKey.paxDestinationCommentKey) as! String

    self.init(paxName: paxName, paxWeight: paxWeight, paxEmergencyName: paxEmergencyName, paxEmergencyPhone: paxEmergencyPhone, paxDestinationComments: paxDestinationComments)
}

所以我找到了一种方法来修复它,运行测试,并且它起作用了,这实际上是非常愚蠢的。 我进入“构建”设置,一起删除了arm64条目,在模拟器上运行该应用程序,将其停止,然后在支持的体系结构列表中重新添加了arm64。

在此处输入图片说明

现在可以使用了!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM