【问题标题】:iOS Crashlytics crash report low memoryiOS Crashlytics 崩溃报告内存不足
【发布时间】:2018-03-23 03:37:07
【问题描述】:

我收到了带有致命异常的 crashlytics 报告:NSUnknownKeyException 和 SIGABRT ABORT 0x0000000181c582e8。我检查了我的故事板,以确保我没有坏的插座,我无法重现错误。因此,我认为崩溃是由于内存不足而发生的。发生这种情况的设备有 14% 的 Ram Free。

这是报告称发生崩溃的行上的代码。 “notes”是 API 响应中的一个键。

if let notes = order.value(forKey: "notes") as? NSArray{

这是堆栈跟踪

【问题讨论】:

    标签: ios memory crashlytics


    【解决方案1】:

    您的问题是您试图访问order 的注释参数,但在这种情况下,order 是一个 NSCFBoolean(@YES 或 @NO,而 NSCFBoolean 基本上是一个 NSNumber)。对于 NSCFBoolean 或 NSNumber 来说,拥有可以访问的 notes 参数是没有意义的。

    您正在崩溃,因为您试图访问不存在的参数。你可能认为order 是一个特定的对象,但不知何故它最终变得不同了。发生这种情况的原因有很多,但在 Swift 中可能归结为假设该变量是其他类型。

    我注意到您的代码是用 Swift 编写的,但错误的重要部分在 Objective-C 中读起来更好。

    您的第一个屏幕截图中的错误是:

    Fatal Exception: NSUnknownKeyException [<__NSCFBoolean 0x1b...> valueForUndefinedKey:]: this class is not key-value coding compliment for the key notes

    这就是说,将valueForUndefinedKey: 消息(如 Swift 函数)发送到位于内存位置的 Bool:0x1b...

    在Objective-C中,可以通过这种方式通过Key Value Observation(KVO)访问对象参数。

    然而,在这种情况下,它返回一个异常,或者基本上是一个以崩溃结束的 NSError,因为这个键不存在。

    我希望这有助于解释问题,这是我在不直接查看您的代码的情况下能做的最好的事情。这与内存不足无关,而是系统试图获取不存在的对象参数的 KVO 错误。

    【讨论】:

    • 感谢您的回复!那么安全访问 notes 参数或检查它是否存在的最佳方法是什么? API 发送回一个 JSON 对象(订单),其中包含一个注释参数,该参数是一个注释数组。我以为我在安全地检查笔记是否有价值?
    • 其实我刚刚意识到“订单”是一个数组而不是一个对象。不敢相信我错过了。现在你的答案更有意义了。谢谢!
    • @nsd32 我建议使用 Decodable 来处理 JSON,因为您使用的是 Swift。非常人性化和干净?
    • 是的,我一直计划很快在这里学习 Decodable。您是否碰巧知道为什么我当前的代码有效而我无法重现崩溃?
    • 不要期望 API 总是一致的......例如,如果提供错误而不是典型结果,那么文档结构将与您设置的不匹配
    猜你喜欢
    • 2019-05-14
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多