在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
属性返回一个有效的字符串而不会崩溃。
其他人已经看到了这个,并且对于发生了什么有任何线索?
答案 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
}