<p> 比较长的一段时间以来,一直有一个IOS7下的crash不时的出现,近期终于找到一个crash现场,实在是个令人兴奋的消息。</p>
<p>二话不说,先上堆栈:</p>
既然是这样,那一种处理方法就是将文本中的阿拉伯文过滤掉了,替换成空格或者其它什么的。以便使用不包含阿拉伯文的文本来计算size。
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>
在应用上述过滤方法之后,部分IOS8以下的系统会受到小小的影响,但是相比较直接闪退而言,这样还算是比较令人接受的了。当然过滤只是一种方式,另外换一个场景,直接用上面的阿拉伯字符串算属性文本的高度,当文本很简单的时候并未发生Crash。或许这个问题还有更好的解决方案,各位如果知道,不妨告诉我。。
</p>