2013-07-02 25 views
1

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等等。如果這個位只是簡單的存在,甚至沒有被調用,所描述的問題就會出現。我現在的猜測是,一些例程是從一個不應該加載的庫中加載的。進一步挖掘。

+0

如果你拿出這個ë? – Skyler

+0

我無法用您的代碼重現問題。將部署目標設置爲5.0並在iOS 5 Simulator中運行後,我可以獲得預期的輸出並且不會崩潰。 - 也許問題出在你從SQLite讀取並轉換爲NSString的地方。你可以顯示該代碼嗎? –

+0

謝謝!你使用哪個版本的xcode? – RickJansen

回答

0

嗯,我的直覺是從加載庫或加載的順序,使我改變了包括框架的順序:在「構建階段」我發現「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移動到列表頂部使其全部工作。

在使用Deployment Target 5.0-6.0時,您仍然可以在調試器中看到「中文」字符。 6.1甚至他們走了。我想他們現在修正了這個問題。

0

沒有完全回答你的問題,而是試圖回答沒有其他人的問題,它會顯示沒有與這些外來字符的「上層」情況關聯。

你可以運行一個正則表達式,或某種字符串替換來修改所有已知的特殊字符與規範化(英文)版本?然後他們會有一個大寫或小寫轉換。

當然,如果這些字符串拼寫不正確,這可能會徹底毀掉您從數據庫中讀取的字符串。

+1

'lowercaseString'和'uppercaseString'適用於所有角色。如果沒有大寫/小寫版本,則字符保持不變。 –

+0

從組裝轉儲看來它實際上是在嘗試一些unichars。它是一直運行良好的代碼,但新的Xcode等。 – RickJansen

+0

哦,我明白了,謝謝你的信息! – jrafferty