簡體   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