IOS7上一種計算屬性文本高度導(dǎo)致的Crash分析

<p>??比較長的一段時間以來稿湿,一直有一個IOS7下的crash不時的出現(xiàn)集峦,近期終于找到一個crash現(xiàn)場延蟹,實(shí)在是個令人興奮的消息评矩。</p>
<p>二話不說,先上堆棧:</p>

crash堆棧

<p>從堆棧上可以看出阱飘,crash發(fā)生在系統(tǒng)的API里面斥杜。而且僅僅是IOS8以下的系統(tǒng)才會發(fā)生,說明在IOS8以上的系統(tǒng)沥匈,蘋果已經(jīng)意識到了這個問題蔗喂,將其修復(fù)了。
</p>
<p>
那么導(dǎo)致問題的原因究竟是什么高帖?
</p>
<p>@"-信 仰缰儿。????????:";
</p>
<p>如上所示试躏,就是這個莫名其妙的字符串能岩,導(dǎo)致的屬性文本在計算高度的時候直接crash融蹂。利用萬能的谷歌一查腺阳,這句是個阿拉伯語掀泳,大意是“真主偉大”盖溺。為何阿拉伯語會導(dǎo)致IOS的系統(tǒng)API產(chǎn)生crash遇革?
</p>
<p>引用知乎上大牛們的解釋:“這個 bug 應(yīng)該歸結(jié)為蘋果從 WebCore 到 CoreText 都存在設(shè)計缺陷沉噩,對從右往左的編輯方向支持的不好吏祸,設(shè)計上沒有考慮這種字符序列对蒲,而不能單純說 WebCore 或者 CoreText 的某個地方有個小 bug。"
</p>
<p>上面這個問題算是見過的最為接近的問題了贡翘,而且crash的堆棧也及其類似蹈矮。所不同的是,上面的問題發(fā)生IOS6上面(這種老古董的系統(tǒng)大家就別用了吧4补馈)含滴,據(jù)說在IOS7上面已經(jīng)得到修復(fù)。不過現(xiàn)實(shí)是目前在處理屬性文本中含有阿拉伯文時丐巫,IOS系統(tǒng)的表現(xiàn)就是不穩(wěn)定谈况。

既然是這樣勺美,那一種處理方法就是將文本中的阿拉伯文過濾掉了,替換成空格或者其它什么的碑韵。以便使用不包含阿拉伯文的文本來計算size赡茸。

需要如何替換?
這里就要用到unicode編碼的相關(guān)知識了祝闻。阿拉伯文一般使用unicode編碼占卧,我們找到它們的具體位置(unicode字符編碼表):

unicode編碼位置

阿拉伯文的范圍為0x600到0x6FF。這樣通過IOS的NSMutableCharacterSet對象联喘,我們就可以找到需要過濾的字符集合华蜒。

簡單的算法如下:
<code>
+ (NSCharacterSet *)tExceptSet
{

// 異常字符集合

static NSCharacterSet *exceptSet;
if (exceptSet == nil)
{
    NSMutableCharacterSet *aCharacterSet = [[NSMutableCharacterSet alloc] init];
    
    NSRange lcEnglishRange;
    lcEnglishRange.location = (unsigned int)0x0600;
    lcEnglishRange.length = (unsigned int)0x06ff - (unsigned int)0x0600;
    [aCharacterSet addCharactersInRange:lcEnglishRange];
    exceptSet = aCharacterSet;
}
return exceptSet;

}

- (NSString )ttLegalNickName:(NSString)nickName
{

NSString* legalNickName = nickName;
if(!IS_IOS_UPPER(@"8.0")) {
    NSCharacterSet *illegalCharacterSet = [CommentInfo tExceptSet];
    
    legalNickName = [[nickName componentsSeparatedByCharactersInSet:illegalCharacterSet] componentsJoinedByString:@""];
}
return legalNickName;

}
</code>
</p>
<p>
??在應(yīng)用上述過濾方法之后,部分IOS8以下的系統(tǒng)會受到小小的影響豁遭,但是相比較直接閃退而言叭喜,這樣還算是比較令人接受的了。當(dāng)然過濾只是一種方式蓖谢,另外換一個場景捂蕴,直接用上面的阿拉伯字符串算屬性文本的高度,當(dāng)文本很簡單的時候并未發(fā)生Crash闪幽∩侗妫或許這個問題還有更好的解決方案,各位如果知道盯腌,不妨告訴我溉知。。
</p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腕够,一起剝皮案震驚了整個濱河市着倾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖蒿囤,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件客们,死亡現(xiàn)場離奇詭異,居然都是意外死亡底挫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門脸侥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來建邓,“玉大人,你說我怎么就攤上這事睁枕」俦撸” “怎么了沸手?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長注簿。 經(jīng)常有香客問我契吉,道長,這世上最難降的妖魔是什么诡渴? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任捐晶,我火速辦了婚禮,結(jié)果婚禮上妄辩,老公的妹妹穿的比我還像新娘惑灵。我一直安慰自己,他們只是感情好眼耀,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布英支。 她就那樣靜靜地躺著,像睡著了一般畔塔。 火紅的嫁衣襯著肌膚如雪潭辈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天澈吨,我揣著相機(jī)與錄音把敢,去河邊找鬼。 笑死谅辣,一個胖子當(dāng)著我的面吹牛修赞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桑阶,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼柏副,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚣录?” 一聲冷哼從身側(cè)響起割择,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萎河,沒想到半個月后荔泳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虐杯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年玛歌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擎椰。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡支子,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出达舒,到底是詐尸還是另有隱情值朋,我是刑警寧澤叹侄,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站吞歼,受9級特大地震影響圈膏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜篙骡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一稽坤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糯俗,春花似錦尿褪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淘正,卻和暖如春摆马,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸿吆。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工囤采, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惩淳。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓蕉毯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親思犁。 傳聞我的和親對象是個殘疾皇子代虾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 在當(dāng)前這個時代(比如說公元2016年),如果你并不是在維護(hù)歷史遺留的文本處理代碼激蹲,沒有在每個地方都使用Unicod...
    縱橫而樂閱讀 2,765評論 3 16
  • 摘要:本文從Unicode入手学辱,介紹由于通信問題而產(chǎn)生的字符集含蓉,以及Unicode的發(fā)展情況。介紹各種字符集的及其...
    瘋狂的冰塊閱讀 2,052評論 0 6
  • 我很好项郊, 一個人的自由, 讓我肆無忌憚斟赚, 像一個王着降, 統(tǒng)治我的世界, 只是偶爾的想起拗军, 讓我眼角泛澀任洞。 我很好蓄喇, ...
    諸葛鹵煮閱讀 319評論 2 2
  • 十年一夢思無常,浮生苦短歲月殤交掏。 傷情自古空余恨妆偏,是非恩怨兩茫茫。
    云夢飛閱讀 198評論 3 6
  • 【9816小時計劃】今日完成情況: 運(yùn)動模塊(六項)——達(dá)成率0% 學(xué)習(xí)模塊(三項)——達(dá)成率0% 增值模塊(六項...
    進(jìn)擊的太2真人閱讀 160評論 0 0