NSString转换为小写的崩溃

xcode 4.6(4H127),xcode 4.6.3(4H1503):具有重音字符的string的简单的低/大写转换会根据Deployment Target的设置而崩溃。 代码片段:

NSString *lc1 = @"Bosnië-Herzegovina"; NSString *lc2 = [lc1 lowercaseString]; NSString *uc3 = [lc1 uppercaseString]; NSLog( @"\nlc1=%@\nlc2=%@\nuc3=%@ ", lc1,lc2,uc3); 

“ë”只是input为“opt-u e”,源代码文件是常规的UTF Unicode。

lc1在debugging器中看起来如预期的那样。 但是,lc2和uc3string在末尾附加了“中文”字符,部署目标<6.1。 随着6.1的select,汉字不见了。 所有这些可能只是debugging器的UTF兼容性,但是对于部署目标5.0-5.1,代码片断甚至崩溃,如下所示,这是我的问题; 在我的实际应用程序中的string不是在源代码,而是从SQLite数据库。 那么,在这个时候,我只能build立我的应用程序部署目标6.0 +? 我错过了什么吗?

 0x1c49a20: incl %eax 0x1c49a21: jmp 0x1c499fb ; CFUniCharMapCaseTo + 1275 0x1c49a23: movl 12(%ebp), %eax 0x1c49a26: movw $105, (%eax) 0x1c49a2b: movw $775, 2(%eax) 0x1c49a31: movl $2, %eax 0x1c49a36: jmp 0x1c49dac ; CFUniCharMapCaseTo + 2220 0x1c49a3b: movl 12(%ebp), %eax 0x1c49a3e: movw $105, (%eax) 0x1c49a43: movw $775, 2(%eax) 0x1c49a49: movw $771, 4(%eax) 0x1c49a4f: movl $3, %eax 0x1c49a54: jmp 0x1c49dac ; CFUniCharMapCaseTo + 2220 0x1c49a59: movl %eax, %edi 0x1c49a5b: movl 1264482(%edi), %eax 0x1c49a61: movl (%eax), %eax 0x1c49a63: movl %eax, (%esp) 0x1c49a66: movl $0, 8(%esp) 0x1c49a6e: movl $48, 4(%esp) 0x1c49a76: calll 0x1bd9980 ; CFAllocatorAllocate 0x1c49a7b: leal 16(%eax), %ecx 0x1c49a7e: movl %ecx, 1379418(%edi) 0x1c49a84: leal 32(%eax), %ecx 0x1c49a87: movl %ecx, 1379422(%edi) 0x1c49a8d: movl 1379410(%edi), %ecx 0x1c49a93: movl (%ecx), %ecx <-- EXC_BAD_ACCESS (code=1,.. 0x1c49a95: movl (%ecx), %ecx 

编辑:我试图最小化项目来显示这个问题,并且…它消失了。 我有一些老式的C代码,使用像malloc,free,free,memmove等等的东西。如果这个位只是简单的存在,甚至没有被调用,所描述的问题就会出现。 我现在的猜测是,一些例程是从一个不应该加载的库中加载的。 进一步挖掘。

如果没有完全回答你的问题,而是试图回答别人的问题,那么与这些外国人物就没有“上层”的情况联系。

你可以运行一个正则expression式,或某种stringreplace来修改所有已知的特殊字符与规范化(英文)版本? 然后他们会有一个大写或小写转换。

当然,如果这些string拼写不正确的话,这可能会彻底毁掉您从数据库中读取的string。

那么,我的直觉是,从库加载出现问题,或者加载的顺序使我改变了框架的顺序:在“构build阶段”中,我发现“CoreText.framework”是最后一个条目之一。 我把它移到了第一位,现在所有的Deployment Targets,5.0,5.1,6.0,6.1都可以正常工作

我实际上看着loadmap,你可以通过将LD_GENERATE_MAP_FILE设置为yes来生成,无济于事。

另一个指针是通过编辑“Scheme”并打开“Log library loads”和“Log API Usage”来提供的,你可以看到东西从不同的库中加载,其中之一是:CoreText.framework

最后,将CoreText.framework移动到列表顶部,这一切都起作用。

在使用Deployment Target 5.0-6.0时,您仍然可以在debugging器中看到“中文”字符。 6.1甚至他们走了。 我猜他们现在修好了。