访问NSError.localizedDescription时偶尔会崩溃

时间:2015-07-22 20:31:10

标签: ios swift parse-platform nserror

在Swift 1.2应用程序中,我有一些记录NSError个对象的代码。在极少数情况下,我收到Crashlytics的崩溃报告,表明访问localizedDescription属性导致崩溃。

这是我的错误记录功能:

func trackError(error: NSError)
{
    var props = [String: AnyObject]()

    // CRASHES HERE
    props["NSErrorLocalized"] = error.localizedDescription

    props["NSErrorCode"] = error.code
    props["NSErrorDomain"] = error.domain

    if let userInfo = error.userInfo {
        props["NSErrorUserInfo"] = userInfo
    }

    self.trackEvent("Error", withProperties: props)
}

以下是Crashlytics报告的调用堆栈:

0 CoreFoundation  CFHash + 129
1 CoreFoundation  CFBasicHashFindBucket + 1204
2 CoreFoundation  CFBasicHashFindBucket + 1204
3 CoreFoundation  CFDictionaryGetValue + 106
4 CoreFoundation  _CFErrorCreateLocalizedDescription + 266
5 Foundation      -[NSError localizedDescription] + 82

我正在考虑直接访问NSLocalizedDescriptionKey中的error.userInfo而不是localizedDescription属性,但由于callstack意味着它在访问字典时崩溃(很可能是userInfo dict),我担心它不能解决任何问题。

我不介意在我的错误日志中不包括localizedDescription,如果没有,但我需要一种安全的方法来检查是否有一个没有崩溃......

可能值得注意的事情:导致此崩溃的NSError对象似乎是Parse SDK返回的对象。我无法确定这一点,但我的其他日志中有一些线索似乎暗示了这一点。

我试图通过对Parse SDK的各种调用强制出现错误情况来重现这一点,但是我的错误记录代码处理它们没有任何问题,localizedDescription属性返回一个有效的字符串而不会崩溃。

其他人已经看到了这个,并且对于发生了什么有任何线索?

3 个答案:

答案 0 :(得分:4)

这可能导致崩溃的一种可能方式是创建错误(在Objective-C中),如[NSError new][[NSError alloc] init](即,不调用指定的初始化程序)。至少在iOS9中,它返回一个有效的实例,但是它的内部结构没有正确初始化,并且如果你在它上面调用方法就会崩溃。调用-userInfo只返回一个空字典,但是尝试访问其他内部状态(如-localizedDescription和类似方法)可能会导致崩溃。

答案 1 :(得分:2)

我最终解决了这个问题:

if let localizedDescription = error.userInfo[NSLocalizedDescriptionKey] as? String {}

而不是直接访问该属性。

答案 2 :(得分:-1)

您是否检查localizedDescription属性是否未设置为nil?尝试这样的事情......

if let errorLocalizedDescription = localizedDescription as! String {
    props["NSErrorLocalized"] = error.localizedDescription
}