簡體   English   中英

NSMutableAttributedString致命異常:NSRangeException

[英]NSMutableAttributedString Fatal Exception: NSRangeException

當我嘗試將屬性應用於子字符串時,有時在以下代碼中崩潰:

// Dummy strings
let originalString = "Some example string"
let searchSubString = "exam"

// Get range of sub-string for which new attributes are to be set.
let rangeOfSubString: NSRange = (originalString.lowercaseString as NSString).rangeOfString(searchSubString.lowercaseString)

// Apply new attributes to the sub-string in original string and show it in UILabel.
let attributedOriginalString = NSMutableAttributedString(string: originalString, attributes: [NSForegroundColorAttributeName : UIColor.blueColor()])
attributedOriginalString.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(14.0), range: rangeOfSubString)
attributedOriginalString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: rangeOfSubString)
self.textLabel.attributedText = attributedOriginalString

以下是堆棧跟蹤:

Thread : Fatal Exception: NSRangeException
0 CoreFoundation 0x26cbefef __exceptionPreprocess
1 libobjc.A.dylib 0x35362c8b objc_exception_throw
2 CoreFoundation 0x26cbef35 -[NSException initWithCoder:]
3 Foundation 0x2793ac3b -[NSRLEArray objectAtIndex:effectiveRange:]
4 Foundation 0x27954b2d -[NSConcreteMutableAttributedString addAttribute:value:range:]

我無法對其進行復制,但是我通過crashlytics收到了該崩潰日志。

崩潰日志似乎表明rangeOfSubString超出了originalString的范圍,但是我認為它永遠不會發生。

誰能指出崩潰的原因是什么?

如果其他人遇到此類問題,請發布我的答案:

更換

let rangeOfSubString: NSRange = (originalString.lowercaseString as NSString).rangeOfString(searchSubString.lowercaseString)

let rangeOfSubString: NSRange = (originalString as NSString).rangeOfString(searchSubString, options: .CaseInsensitiveSearch)

計算子字符串范圍的第一種方法是錯誤的原因:

  • 它正在計算子字符串范圍WRT小寫版本,並將該范圍的屬性應用於原始字符串(非小寫)。 但是,如果使用特殊字符,則使用上述方法計算的范圍可能會超出原始字符串范圍,因為小寫字符可能比大寫版本需要更多的長度,反之亦然。

    例如,土耳其語大寫字母“İ”的長度為1,而小寫字母“i̇”的長度為2。

  • 對於前。 如果我們在“Hİ”(length = 2)中搜索“İ”,則第一種方法將為您提供一個range(1,2),因為小寫的“İ”需要length = 2,但是如果您應用range(1、2 )到“Hİ”,它將超出范圍(0,2)的范圍,或者如果原始字符串中有更多字符(如“Hİabc”),則它將對應於“İa”,這又是錯誤的。

  • 因此,計算范圍WRT原始字符串,稍后我需要將該范圍應用於原始字符串本身。

另請參閱蘋果的文檔:

小寫字符串:

不保證大小寫轉換是對稱的或產生與原始長度相同的字符串。

lcString = [myString lowercaseString];

可能不等於以下語句:

lcString = [[[myString uppercaseString] lowercaseString];

例如,德語中“ß”的大寫形式是“ SS”,因此將“Straße”轉換為大寫然后是小寫會產生以下字符串序列:

“Straße”

“ STRASSE”

“大街”

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/#//apple_ref/occ/instp/NSString/lowercaseString

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM