2011-10-23 47 views
0

如果我將10Mb的數據放入其中,然後將長度設置爲零,那麼使用1Mb容量初始化NSMutableData會發生什麼?它是否將容量縮小回初始值或保持原樣(目前爲10Mb)?NSMutableData長度變化的容量

所以基本上我需要將整個數據對象縮小到初始容量,而且我不需要內部數據,但我不喜歡爲此重新創建對象的想法,有什麼方法可以實現這一點?

+0

你是否按照VinceBurn的建議進行測試? – jAckOdE

回答

1

的文檔狀態:

setLength: 擴展或截短一個可變數據對象到一個給定的長度。

- (void)setLength:(NSUInteger)length 

參數 長度 用於接收器的新長度。

討論 如果可變數據對象被擴展,則附加字節用零填充。

可用性 適用於Mac OS X v10.0及更高版本。 請參見 - increaseLengthBy: 相關示例代碼 LSMSmartCategorizer 宣佈 NSData.h


所以,我會去的 「截斷」 爲0的大小。
但是可以肯定的是你可以做一些測試並檢查儀器中的堆跡。

3

Apple沒有保證這裏有任何特定的行爲,但就我的經驗而言,NSMutableData只會在容量上「增長」,它永遠不會縮小。這意味着,如果你創建一個NSMutableData對象,向它添加10 MB的數據,然後將其長度設置爲0,它實際上仍然在內部有一個10 MB的存儲空間分配,它只會報告0的長度屬性。這是你可以使用NSMutableArray監視的類似行爲,也可以用其他編程語言監視的行爲(例如大多數Java標準對象的行爲方式)。

原因很簡單:內存分配是一項昂貴的操作。不是非常昂貴,但通常不是O(1)。只改變長度是一個非常快的O(1)操作,因爲它只需要改變一個實例變量。如果減小長度並且NSMutableArray縮小其內部存儲空間,則必須執行重新分配,並且下次添加數據時,必須再次執行重新分配。這意味着如果你想使用盡可能少的內存,你不應該把長度設置爲零,而是創建一個新的NSMutableData並釋放舊的。只有這樣才能保證儘可能減少內存使用量。缺點是下一次你增加內存時,它將是一個更昂貴的操作,因爲重新分配是必要的。這是通常的CPU與內存的折衷。您允許使用一段代碼的內存越少,它通常會消耗的內存就越多;另一方面,您允許使用一段代碼的內存越多,可以節省的CPU時間就越多。

由於Mac通常擁有大量內存,因此它不會爲可變數據對象重新分配其內部內存而付出代價,至少在這種情況下不會節省幾個MB。另一方面,如果您將500 MB數據對象縮回到零,它可能真的重新分配。由於沒有行爲保證,NSMutableData在iOS上可能表現完全不同,因爲在iOS設備上內存是一種更受限制的資源。