2

我的 iOS 应用程序在 iOS 8.2 上崩溃,但在 iOS 9 及更高版本上运行良好。当我检查崩溃日志时,以下函数导致崩溃(写在NSMutableAttributedString扩展中)

func changeFont(font: UIFont, range : NSRange, keepFontSize: Bool = false)
{
    let traits     = font.fontDescriptor().symbolicTraits
    let descriptor = baseDescriptor.fontDescriptorWithSymbolicTraits(traits)

    let newFont    = UIFont(descriptor: descriptor, size: keepFontSize ? descriptor.pointSize : baseDescriptor.pointSize)

    self.removeAttribute(NSFontAttributeName, range: range)
    self.addAttribute(NSFontAttributeName, value: newFont, range: range) // <- Crash happens here
}

崩溃日志

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“NSConcreteMutableAttributedString addAttribute:value:range::nil value”

当我调试并记录该函数中使用的变量时,descriptor&newFont都显示为<uninitialized>

(lldb) po traits
▿ UIFontDescriptorSymbolicTraits
  - rawValue : 268435458            

(lldb) po baseDescriptor
UICTFontDescriptor <0x7fc075b574c0> = {
    NSFontNameAttribute = CenturyGothic;
    NSFontSizeAttribute = 14;
}

(lldb) po descriptor
 <uninitialized>

(lldb) po keepFontSize
true

(lldb) po newFont
 <uninitialized>

我不能在这里使用if letnewFont != nil检查,因为两者都会抛出一个错误,说“ UIFont won't be nil ”。我该如何解决这个崩溃?(或者我如何检查对象是否已初始化?)我真的被这个问题困住了,因为我的大多数用户仍然使用 iOS 8。

4

0 回答 0