xcode 4.6 (4H127)、xcode 4.6.3 (4H1503):根据部署目标的设置,对带有重音字符的字符串进行简单的小写/大写转换会崩溃。代码片段:
NSString *lc1 = @"Bosnië-Herzegovina";
NSString *lc2 = [lc1 lowercaseString];
NSString *uc3 = [lc1 uppercaseString];
NSLog( @"\nlc1=%@\nlc2=%@\nuc3=%@ ", lc1,lc2,uc3);
“ë”简单地键入为“opt-u e”,源代码文件是常规的 UTF Unicode。
lc1 在调试器中看起来与预期的一样。但是,lc2 和 uc3 字符串末尾附加了“中文”字符,部署目标 < 6.1。选择了 6.1,中文字符消失了。所有这一切可能只是调试器的 UTF 兼容性,但是对于部署目标 5.0-5.1,代码片段甚至会崩溃,如下所示,这就是我的问题;我实际应用程序中的字符串不在源代码中,而是来自 SQLite 数据库。那么,此时我只能为部署目标 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
编辑:我尝试最小化项目以显示此问题,然后......它消失了。我有一些使用 malloc、free、freed、memmove 等东西的老式 C 代码。如果这个位只是存在,甚至没有被调用,就会出现所描述的问题。我现在的猜测是,某些例程是从不应加载的库中加载的。进一步挖掘。