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