2012-03-17 68 views
2

兩者都返回相同的指針。我知道- bytes屬於NSData,爲什麼NSMutableData介紹- mutableBytes?它僅僅是爲了代碼的清晰性,所以你訪問可變數據更明顯嗎?使用哪一個真的很重要?NSMutableData的mutableBytes和字節方法之間的區別

NSMutableData* mydata = [[NSMutableData alloc] init]; 
[mydata appendData: [@"hello" dataUsingEncoding:NSUTF8StringEncoding]]; 
NSLog(@"%p", [mydata mutableBytes]); 
NSLog(@"%p", [mydata bytes]); 

感謝。

回答

3

有幾個原因NSMutableData可能會提供一個單獨的mutableBytes方法:

  • 正如你在你的問題建議,使用mutableBytes清楚到要更改數據的讀取器。

  • 該方法返回const void *mutableBytes方法返回void *。如果要更改字節,則需要void *且沒有const限定符。 mutableBytes方法消除了丟棄const限定符的需要。

在理論上有可能是第三個理由:-[NSData mutableCopy]方法可以返回一個NSMutableData指向相同緩衝原來NSData,只有當你調用mutableBytes創建緩衝區的一個新的,可變的副本。但是,我不認爲這是基於我非常有限的測試實現的。

+0

只要稍微添加到@ rob的答案,' - bytes'方法是隻讀的**,即使從NSMutableData **調用時也是如此。是基類的一部分,但是如果你使用NSMutableData並且需要一個可變的字節拷貝,你可以調用' - mutableBytes'函數,以便你可以對它進行修改(這是可變的意思)。 – lnafziger 2012-03-17 03:45:31

+0

任何人都知道NSMutableData數據管理的內部? ' - mutableBytes'指針是否將所有數據精確地放在一行中,還是將數據分段爲例如1kb的塊,並且在每個段的末尾是否是指向下一個1kb段的指針? (我希望這是有道理的)。 – 2012-03-20 19:17:21

+2

@Dabbu'NSData'和'NSMutableData'將它們的內容存儲爲一個連續的字節數組。 – 2012-03-20 19:28:12

0

一個除了rob's answer和他的評論:

@Dabbu的NSData和NSMutableData存儲其內容作爲一個連續 陣列的字節。

要記住這裏的事情是,這種行爲是在iOS7改變:現在NSData/NSMutableData不能保證讓內容作爲一個連續的數組。它可以存儲爲多個塊。

因此,當您撥打bytes/mutableBytes時,如果需要,他們會將內容複製並拼合成一個連續的字節數組,然後返回指向此連續塊的指針。

根據您嘗試執行的操作,可能會導致意外的性能損失或對於大型緩衝區的內存消耗過多。

相關問題