NSString转换为小写崩溃

时间:2013-07-02 17:12:17

标签: ios objective-c sqlite nsstring xcode4.6

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

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

2 个答案:

答案 0 :(得分:0)

如果没有完全回答你的问题,但试图像其他人一样回答问题,那么就会发现没有“上层”案例与这些外国人的关联。

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

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

答案 1 :(得分:0)

好吧,我的预感是从库中加载有问题,或者加载顺序让我改变了包含框架的顺序:在“Build Phases”下我发现“CoreText.framework”是最后一个条目之一。我把它移到了最前面的位置,现在所有部署目标,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移动到列表顶部使其全部工作。

使用部署目标5.0-6.0时,您仍可以在调试器中看到“中文”字符。随着6.1甚至他们走了。我想他们现在解决了这个问题。