iOS崩溃报告“意外启动状态”异常?

Posted

技术标签:

【中文标题】iOS崩溃报告“意外启动状态”异常?【英文标题】:iOS crash report "unexpected start state" exception? 【发布时间】:2018-04-03 12:45:12 【问题描述】:

我发现了几个崩溃报告,原因是 unexpected start state。我的代码如下所示:

NSRange range = [content rangeOfString:@"<html>"];

if (range.location != NSNotFound) 
    NSString *htmlStr = [content substringFromIndex:range.location];

    NSAttributedString *attStr = [[NSAttributedString alloc] initWithData:[htmlStr dataUsingEncoding:NSUnicodeStringEncoding] options:@NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType documentAttributes:nil error:nil];

    return attStr.string;

崩溃报告如下所示:

【问题讨论】:

看起来您正在加载的数据无效或损坏,或者无法解析。对带有错误处理程序的文档加载器的 try/catch 怎么样? 非常感谢。我会试试看它是否起作用 我也遇到了类似的问题,请问哪里可以解决? 您的 html 有效吗?你是在主线程上调用这段代码吗? 这里也一样。任何更新?我无法重现它。 【参考方案1】:

只需在后台线程中调用您的函数:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
    // here, call your function

    dispatch_async(dispatch_get_main_queue(), ^
        // do updates on main thread
    );
);

【讨论】:

参考文档:"The HTML importer should not be called from a background thread"【参考方案2】:

当您尝试使用除主线程之外的任何其他线程的 html 内容初始化 NSAttibutedString 时,会发生上述崩溃。

所以这里的解决方案是确保上面的NSAttributedString初始化总是从主线程调用

DispatchQueue.main.async 
    let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [.documentType: NSAttributedString.DocumentType.html]
    let htmlString = try? NSAttributedString(data: htmlData, options: options, documentAttributes: nil)

引用documentation:

不应从后台线程调用 HTML 导入器(即,选项字典包含值为 html 的 documentType)。它将尝试与主线程同步,失败并超时。从主线程调用它是可行的(但如果 HTML 包含对外部资源的引用,仍然会超时,应该不惜一切代价避免这种情况)。 HTML 导入机制旨在实现诸如 markdown 之类的东西(即文本样式、颜色等),而不是用于一般的 HTML 导入。

【讨论】:

以上是关于iOS崩溃报告“意外启动状态”异常?的主要内容,如果未能解决你的问题,请参考以下文章

TestFlight 崩溃报告

iOS 应用程序崩溃并出现与 _NSFastEnumerationMutationHandler 相关的异常

iOS 6 上的 MapKit 崩溃

xcode 6.1中的崩溃日志符号化IOS 8.1.2?

如何使用原生崩溃报告在 Swift 4 中实现异常/错误处理?

异常捕获 ACRA 崩溃报告