UIFont初始化程序返回<uninitialized>对象并使应用程序崩溃

时间:2016-05-23 07:12:31

标签: ios swift uifont nsmutableattributedstring uifontdescriptor

我的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   值'

当我调试并记录该函数中使用的变量时,descriptor&amp; 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不会是”。 我该如何修复这次崩溃? (或者我如何检查对象是否已初始化?)我真的坚持这个问题,因为我的大多数用户仍然使用iOS 8。

0 个答案:

没有答案