首页 > 解决方案 > NSAttributedString 的初始化使应用程序崩溃

问题描述

尽管它在do-catch块内,但下面的代码会崩溃(并非总是但很少)。 Fabric crashlytics声明例外是Fatal Exception: NSInternalInconsistencyException,有时这EXC_BAD_ACCESS KERN_PROTECTION_FAILURE 0x000000016fccb1f8

do {
    return try NSAttributedString(
        data: data,
        options: [
            .documentType:  NSAttributedString.DocumentType.html,
            .characterEncoding: String.Encoding.utf8.rawValue
        ],
        documentAttributes: nil
    )
} catch {
    return NSAttributedString()
}

虽然我阅读了它的苹果文档,NSAttributedString但它声明它应该在主线程上,所以我用Dispatch.main.async块包围它,但这样做并没有设置设置的样式NSAttributedString

标签: iosswiftswift4crashlytics

解决方案


根据此处苹果开发者论坛提供的解决方案:https ://forums.developer.apple.com/thread/115405

遗憾的是,这是 iOS (r. 23592459) 中的一个已知错误,它可能会影响从 HTML 构造 NSAttributedString 的任何人。

除了完全避免使用此 API 之外,没有好的解决方法。我的建议:

如果要显示大块复杂的 HTML,请使用 WKWebView。

如果这个 HTML 受到高度约束——也许你只是使用 HTML 作为一种简单的方法来传输一组受约束的属性,比如粗体和斜体——创建你自己的不依赖于 HTML 的标记系统。或者仅针对这些属性解析 HTML 并使用结果来创建您的属性字符串。

很抱歉我在这里没有更好的消息。

因此,为避免崩溃,您可能需要避免使用NSAttributedString( data:函数本身并编写自己的方式来解析 html。


推荐阅读