访问NSError.localizedDescription时偶尔崩溃

Pas*_*que 3 nserror ios parse-platform swift

在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)
}
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

我在考虑直接访问NSLocalizedDescriptionKeyin error.userInfo而不是通过localizedDescription属性访问,但是由于调用栈暗示它在访问字典时崩溃(这很可能是userInfo字典),所以我担心它无法解决任何问题。

我不介意localizedDescription在错误日志中不包含,但是我需要一种安全的方法来检查是否存在一个而不崩溃。

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

我尝试通过对Parse SDK进行各种调用来强制错误情况来重现此错误,但是我的错误日志记录代码可以毫无问题地处理它们,并且该localizedDescription属性返回有效字符串而不会崩溃。

其他人已经看到了这一点,并且对正在发生的事情有任何线索吗?

Car*_*erg 5

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


Pas*_*que 5

我最终通过以下方式解决了这个问题:

if let localizedDescription = error.userInfo[NSLocalizedDescriptionKey] as? String {}
Run Code Online (Sandbox Code Playgroud)

而不是直接访问该属性。