的NSString转换为小写崩溃(NSString conversion to lowercase

2019-10-18 08:23发布

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);

在“E”被简单地类型为“选择-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,自由,解放,的memmove等,如果此位仅仅是存在,甚至不叫老式的C代码,描述的问题发生。 我的猜测是现在,一些程序从它不应该从加载库加载。 进一步挖掘。

Answer 1:

如果没有准确地回答你的问题,而是试图回答,因为没有其他人,似乎有与外国字符没有“上”的情况下的关联。

你可以运行一个正则表达式,或某种字符串替换修改所有已知的特殊字符归一化(英文)版本? 然后,他们将有一个大写或小写转换。

当然,这可能会完全毁掉你从数据库中读取,如果他们不正确拼写的字符串。



Answer 2:

嗯,我的预感,有一个与负载问题从图书馆,或加载顺序让我改变了框架的顺序包括:“构建阶段”下,我发现“CoreText.framework”作为最后一个条目。 我把它搬到了头把交椅,而现在所有的所有部署目标工作得很好,5.0,5.1,6.0,6.1

其实我看了看loadmap,你可以通过设置LD_GENERATE_MAP_FILE为yes,无济于事产生。

另一个指针被编辑了“计划”和“日志库加载”和“登录API使用”切换,你可以看到这些东西是从各个库加载,其中一人提供:CoreText.framework

最终移动CoreText.framework到列表的顶部使得它所有的工作。

“中国”字,你仍然可以在调试器中看到使用部署目标5.0-6.0时。 随着6.1甚至他们都不见了。 我猜他们固定的,现在。



文章来源: NSString conversion to lowercase crashes