2011-10-23 48 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设备上内存是一种更受限制的资源。