2012-02-27 80 views
4

將NSString轉換爲NSData有多種不同的方法。iOS:將NSString轉換爲NSData的不同方法

NSString *req_string = @"I am a NSString."; 
NSData *req_data = [NSData dataWithBytes:[req_string UTF8String] length:[req_string length]]; 
// or 
NSData *req_data_alt = [req_string dataUsingEncoding:NSUTF8StringEncoding]; 

這兩種方法有什麼不同?

+1

有趣:一個是NSData的類方法,另一個是NSString的實例方法:) – doNotCheckMyBlog 2012-02-27 04:41:42

回答

6

後者(NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding])是我會推薦的選項。

爲什麼?

有些人會說效率。在這種情況下,使用字符串實例方法來創建一個NSData對象只需要一個單獨的obj-c消息分派到Apple的代碼中,該代碼被高度優化。在另一種情況下(使用類方法創建一個新的NSData對象)將需要2個消息分派給你的字符串對象,1個消息分派給NSData類對象。

但是,運行時間不太可能會有很大的不同,即使他們這樣做,編碼的成本將取決於字符串的長度,而不是用於創建NSData對象的方法。

我認爲你想在NSString上使用實例方法的真正原因是語義和清晰度。

讓我們考慮這些選項的僞英譯:

  • [string DataUsingEncoding:NSUTF8StringEncoding]:嘿,串,我想你使用UTF8編碼給我自己的NSData的副本。好的,謝謝,把它放在那裏 - 不,不在地毯上。
  • [NSData dataWithBytes:[req_string UTF8String] length:[req_string length]]:String!給我你所有的UTF8字節。是的,哦,我也需要你的長度。秒。 NSData,過來這裏,我需要你拿起這些東西,字符串正在離開我的家門口,把它變成一個數據對象,字符串,等等,輕輕地!不要破壞任何東西」

這似乎更清楚嗎?

+0

有趣的解釋。謝謝你的建議。 – Raptor 2012-02-27 06:15:47

4

你第一個電話是不正確。[req_string length]並不一定長度,以字節爲單位,其-UTF8String的。你應該使用strlen得到真正的該-UTF8String的長度,而不是

這個例子表明,使用-[NSString dataUsingEncoding:]更好 - 有一個較少的參數來獲取錯誤

還要注意:該文檔爲-[NSString dataUsingEncoding:]指出返回的數據是一個「外部表示」,意思是傳送給其他機器,可能在前面包含BOM(字節順序標記)。在實踐中,BOM比UTF8更糟糕,所以-dataUsingEncoding:不包括它。如果你選擇不同的編碼,你可能會看到它。