xcode 4.6(4H127),xcode 4.6.3(4H1503):根據部署目標的設置,帶有重音字符的字符串的簡單的低/大寫轉換會崩潰。代碼片段:NSString轉換爲小寫崩潰
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
編輯: 我試圖最小化項目,以顯示這個問題,... ...它消失了。我有一些舊式的C代碼,它們使用malloc,free,free,memmove等等。如果這個位只是簡單的存在,甚至沒有被調用,所描述的問題就會出現。我現在的猜測是,一些例程是從一個不應該加載的庫中加載的。進一步挖掘。
如果你拿出這個ë? – Skyler
我無法用您的代碼重現問題。將部署目標設置爲5.0並在iOS 5 Simulator中運行後,我可以獲得預期的輸出並且不會崩潰。 - 也許問題出在你從SQLite讀取並轉換爲NSString的地方。你可以顯示該代碼嗎? –
謝謝!你使用哪個版本的xcode? – RickJansen