1

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 代码。如果这个位只是存在,甚至没有被调用,就会出现所描述的问题。我现在的猜测是,某些例程是从不应加载的库中加载的。进一步挖掘。

4

2 回答 2

0

如果没有准确回答您的问题,而是尝试像其他人没有的那样回答,那么这些外来字符似乎没有“大写”关联。

您能否运行正则表达式或某种字符串替换来使用规范化(英文)版本修改所有已知的特殊字符?然后他们将进行大写或小写转换。

当然,如果拼写不正确,这可能会完全破坏您从数据库中读取的字符串。

于 2013-07-02T17:28:16.353 回答
0

好吧,我的预感是从库加载存在问题,或者加载顺序使我改变了包括框架的顺序:在“构建阶段”下,我发现“CoreText.framework”是最后一个条目之一。我把它移到了首位,现在所有部署目标都可以正常工作,5.0、5.1、6.0、6.1

我实际上查看了加载图,您可以通过将 LD_GENERATE_MAP_FILE 设置为 yes 来生成它,但无济于事。

通过编辑“方案”并打开“日志库加载”和“日志 API 使用”提供了另一个指针,因为您可以看到这些内容是从各种库中加载的,其中一个是:CoreText.framework

最后,将 CoreText.framework 移到列表的顶部使其一切正常。

使用部署目标 5.0-6.0 时,您仍然可以在调试器中看到“中文”字符。有了 6.1,它们甚至都消失了。我猜他们现在已经解决了。

于 2013-07-02T23:54:04.740 回答