首先,需要说明的是,这个Bug是否是系统Bug无法直接证明,至少在我的测试环境下确认并不是由我们App引起的Bug,这个Bug在一个新构造的项目中也能复现,经此,我判断为苹果在iOS9中删改了一部分代码导致的系统Bug。
该Bug对App的内存消耗有一定影响,而且测试发现难以释放,万幸的是,国内大多数App几乎不可能出现这个Bug,但,若有朋友维护的App需要与阿拉伯地区打交道则需稍加警惕。
该Bug判断为特殊字符无法识别引起的Bug,具体缘由似乎是苹果在构造iOS9的时候取消了一部分特殊字符的支持,导致当使用iOS9大版本的设备进行测试时XCode控制台会报相应警告(在iOS8中不会出现该Bug),当特殊字符出现在Label中时控制台会报如下警告:
2016-08-04 18:22:08.506 Shou[422:116177] CoreText: *** Unmapped ".ৢৢ͜͡" <CTFont: 0x12fcfbc00>{name = .SFUIText-Regular, size = 16.000000, matrix = 0x0, descriptor = <CTFontDescriptor: 0x12fab5c00>{attributes = <CFBasicHash 0x12fab6f30 [0x1a123f150]>{type = mutable dict, count = 2,
entries =>
0 : <CFString 0x19cc53be0 [0x1a123f150]>{contents = "NSCTFontUIUsageAttribute"} = <CFString 0x19cc440c0 [0x1a123f150]>{contents = "CTFontRegularUsage"}
2 : <CFString 0x19cc53740 [0x1a123f150]>{contents = "NSFontNameAttribute"} = <CFString 0x19cc47160 [0x1a123f150]>{contents = ".SFUIText-Regular"}
}
>}}
似乎简书无法识别代码块中 Unmapped后的字符的样子,它的具体形状就像两朵蒲公英一样。
在测试中我仅发现Xcode可以完美识别出特殊字符(浏览器悉数阵亡)。
也是机缘巧合,当我在处理Right To Left 相关细节的时候才发现这中字符应该是阿拉伯文的一种(至少它出现在阿拉伯文软键盘中,至于它是不是,反正我也看不懂。)
就像这样:
无法识别的特殊字符就是这么一群家伙,当然,这只是我找到的,具体苹果去除了多少类似字符的支持也无从判断,但至少当你的App中出现它们时是会受到影响的。
那么,问题来了,这些无法识别的字符到底会给App带来怎么样的影响呢?
这里我们用一个App相关的功能进行测试。
Today Extension是我们App中的一部分,苹果对Extension的建议内存消耗是10M,当内存消耗超出10M时则会报内存警告。
如上图所示,一个不存在特殊字符的Today Extension内存消耗为8.6M。
那么,当Label中存在特殊字符的内存消耗是多少呢?
在其他数据都不存在变化的时候,内存消耗增加了2M多,并且这不是峰值数据,最高峰值曾达到12M+。
仅仅是两次测试并不能保证数据的严谨性,因此,以TodayExtension为测试对象,共准备了三组其他数据相同,唯有显示文本不同的测试对象,分别为英文文本、繁中文本、繁中文本带特殊字符三组,各测试4次。(实在找不到英文文本带特殊字符的对象,天知道湾湾为何喜欢在名字里加莫名其妙的特殊字符。)
英文文本内存消耗为8.2、8.3、8.2、8.2。
繁中文本内存消耗为8.2、8.3、8.0、8.2。
繁中文本带特殊字符内存消耗为11.1、11.7、11.5、11.9。
很明显,带有特殊字符的内存消耗比其他两组高上不少,目前并不清楚该内存消耗的增加仅在Xcode测试环境下因为控制台警告而存在还是任何环境下都会存在,我想后者的概率更大。
有兴趣的朋友可以在DEMO中测试一下。