【问题标题】:Swift: nskeyedunarchiver fails and terminates app with 'NSInvalidArgumentException', reason: '-[__NSCFData count]Swift:nskeyedunachiver 失败并以 'NSInvalidArgumentException' 终止应用程序,原因:'-[__NSCFData count]
【发布时间】:2021-06-01 15:55:25
【问题描述】:

NSKeyedUnarchiver.UnarchivedArrayOfObjects() 以 'NSInvalidArgumentException' 终止应用程序,原因:'-[__NSCFData count]

  1. track 符合 NSManagedObject 然而 decodedTrackLocation 被声明为@Published public var decodedTrackLocation: [CLLocation] = [],因为它不是持久的,而是应该在内存中。

  2. 以下代码适用于某些“保存”,但有时它会引发异常,我不知道该怎么办。

  3. 它在 'if let final =' 处崩溃并抛出此异常:

2021-06-01 17:42:28.052628+0200 GeoTrack[12300:1124356] -[__NSCFData count]: unrecognized selector sent to instance 0x17a61df50
2021-06-01 17:42:28.061055+0200 GeoTrack[12300:1124356] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFData count]: unrecognized selector sent to instance 0x17a61df50'
*** First throw call stack:
(0x1a9e27298 0x1bdb81480 0x1a9d362a8 0x1a9e298f4 0x1a9e2b89c 0x1ad67168c 0x1ad707e24 0x1026e5988 0x102704310 0x1b0345f94 0x1b0345fb0 0x1b0345f94 0x1b0737d74 0x1b0733e68 0x1b02225f4 0x1b088b190 0x1031f7ae8 0x102ee7ae8 0x102ee932c 0x102ef776c 0x1a9da62e0 0x1a9da0740 0x1a9d9f818 0x1c04a5570 0x1ac6cb0e8 0x1ac6d0664 0x1025696dc 0x1a9a7e140)
libc++abi: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFData count]: unrecognized selector sent to instance 0x17a61df50'
terminating with uncaught exception of type NSException
  1. NSKeyedUnarchiver 失败的原因是因为我做了一些愚蠢的事情,我存储了错误的数据。我无法理解的是为什么此代码所在的 do-try-catch 块不起作用/捕获。 任何帮助将不胜感激。

问题中的代码:

do{
   let out = try Data(referencing: NSData(data: track.trackLocation).decompressed(using: .lzma))
   let archiver = try NSKeyedUnarchiver(forReadingFrom: out)
   archiver.requiresSecureCoding = true
   archiver.decodingFailurePolicy = .setErrorAndReturn
   if let final = archiver.decodeArrayOfObjects(ofClass: CLLocation.self, forKey: NSKeyedArchiveRootObjectKey){
      track.decodedTrackLocation = final
   }
} catch {
   print(error)
}
do{
   let out = try Data(referencing: NSData(data: track.trackLocation).decompressed(using: .lzma))
   if let final = try NSKeyedUnarchiver.unarchivedArrayOfObjects(ofClass: CLLocation.self, from: out){
       track.decodedTrackLocation = final
   }
} catch {
   print(error)
}

【问题讨论】:

  • 你贴了两个解码代码sn-ps,哪个崩溃了?后一种,两者兼而有之?另外,崩溃是从哪里来的,你是在main文件中做try吗?
  • 两个代码sn-ps都失败了,我现在知道是什么导致了异常;愚蠢的我保存了数据的 NSKEyederarchive,而不是 [CLLocation]。我会立即更新问题。我不明白为什么其中的 catch 块没有捕获异常。感谢您的帮助!
  • 因为抛出的不是Error (throws),而是在Objective-C 上的NSInvalidArgumentExceptionNSException。你可以找找:)
  • 感谢您的回复!我会将问题标记为已解决!

标签: ios swift nskeyedunarchiver invalidargumentexception


【解决方案1】:

因为它不是抛出(抛出)的错误,它是一个 NSInvalidArgumentException,一个 NSException,在 Objective-C 上。你可以找它:) - Larme

我学到了一些新东西!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 2013-04-27
    • 2021-09-17
    • 2012-07-12
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多