2011-06-07 72 views
3

我在做使用像NSStringNSData高層可可的功能,而不是向下挖掘至C級之類的東西上的char小號陣列工作的一些字符串操作的中間。「的NSString stringWithUTF8String:」過於敏感

對於它的愛,+[NSString stringWithUTF8String:]有時返回nil上一個完美的字符串,首先用-[NSString UTF8String]創建。人們會認爲這是在輸入格式錯誤時發生的。下面是失敗時,以十六進制輸入的一個示例:

55 6B 66 51 35 59 4A 5C 6A 60 40 33 5F 45 58 60 9D 47 3F 6E 5E 
60 59 34 58 68 41 4B 61 4E 3F 41 46 00 

和ASCII:

UkfQ5YJ\j`@3_EX`G?n^`Y4XhAKaN?AF 

這是隨機生成的字符串,來測試我子程序。

char * buffer = [randomNSString UTF8String]; 
// .... doing things .... in the end, buffer is the same as before 
NSString * result = [NSString stringWithUTF8String:buffer]; 
// yields nil 

編輯:萬一有人沒掌握隱含的問題,在這裏它是在-v模式:

爲什麼[的NSString stringWithUTF8String:]有時返回一個五臟俱全nil UTF8-串?

+0

在'-UTF8String'和'-stringWithUTF8String:'之間是否有任何機會autorelease池被耗盡? – 2011-06-07 09:40:16

+0

@Bavarious:不,緩衝區在'stringWithUTF8String:'被調用的時候仍然活着。 – 2011-06-07 09:49:10

+1

你能發佈產生該緩衝區的原始UTF-8字符串嗎?可能首先通過'-dataUsingEncoding:'來表示'NSData'表示,然後是'-UTF8String'之後的緩衝區。 – 2011-06-07 09:54:30

回答

0

這在黑暗中有點刺,因爲我們沒有足夠的信息來正確診斷問題。

如果randomNSString不再在您分配的內存result,舉例來說,如果它已經在引用計數的環境中釋放或在GC環境中收集的點存在,有可能buffer指向具有記憶被釋放但尚未被重用(這可以解釋爲什麼它仍然是一樣的)。

但是,創建一個新的NSString需要分配內存,它可能會使用緩衝區指向的塊,這意味着您的UTF8字符串會被新的NSString的內部消除。您可以通過在未能創建result之後登錄緩衝區的內容來測試此理論。不要使用%s說明符,但打印十六進制字節。

2

walkytalky是對的。 9d在這種方式在utf8中不合法。 UTF8字節的前10位保留爲連續字符,它們不會出現前綴字符不超過一個前導位。