NSAttributedString的初始化正在使应用程序崩溃

时间:2018-12-28 05:48:05

标签: ios swift swift4 crashlytics

下面的代码尽管崩溃在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块将其包围,但是这样做并没有设置在{{1}上设置的样式}

3 个答案:

答案 0 :(得分:2)

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

  

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

     

除了避免使用此API之外,没有其他解决方法   共。我的建议:

     

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

     

如果此HTML受到严格限制-也许您只是将HTML用作   一种传输受约束的属性集(如粗体和   斜体-创建您自己的不依赖HTML的标记系统。   或仅解析这些属性的HTML,然后将结果用于   创建您的属性字符串。

     

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

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

答案 1 :(得分:1)

仅在主线程中更新UI。

DispatchQueue.main.async {
    textLabel.attributedText = generateAttribString()
}

答案 2 :(得分:0)

如果您尝试将HTML转换为String,则可以使用String扩展名,如下所示:

extension String {
    var htmlToAttributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: Data(utf8),
                                          options: [.documentType: NSAttributedString.DocumentType.html,
                                                    .characterEncoding: String.Encoding.utf8.rawValue],
                                          documentAttributes: nil)
        } catch {
            print("error: ", error)
            return nil
        }
    }
    var htmlToString: String {
        return htmlToAttributedString?.string ?? ""
    }
}