Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSMUTABLE长度变化时的数据容量_Objective C_Nsmutabledata - Fatal编程技术网

Objective c NSMUTABLE长度变化时的数据容量

Objective c NSMUTABLE长度变化时的数据容量,objective-c,nsmutabledata,Objective C,Nsmutabledata,如果我将10Mb的数据放入NSMutableData,然后将长度设置为零,那么使用1Mb容量初始化NSMutableData会发生什么情况?它是否将容量收缩回初始值或保持原样(目前为10Mb) 所以基本上我需要将整个数据对象缩小到初始容量,我不需要内部数据,但我不喜欢为此重新创建对象的想法,有什么方法可以实现吗?文档状态: 设定长度: 将可变数据对象扩展或截断到给定长度。 - (void)setLength:(NSUInteger)length 参数 长度 接收器的新长度 讨论 如果可变数据对

如果我将10Mb的数据放入NSMutableData,然后将长度设置为零,那么使用1Mb容量初始化NSMutableData会发生什么情况?它是否将容量收缩回初始值或保持原样(目前为10Mb)


所以基本上我需要将整个数据对象缩小到初始容量,我不需要内部数据,但我不喜欢为此重新创建对象的想法,有什么方法可以实现吗?

文档状态:

设定长度: 将可变数据对象扩展或截断到给定长度。

- (void)setLength:(NSUInteger)length
参数 长度 接收器的新长度

讨论 如果可变数据对象被扩展,那么额外的字节将被零填充

可用性 在Mac OS X v10.0及更高版本中提供。 另见 –将长度增加: 相关示例代码 LSMSmart分类程序 声明于 NSData.h


所以我会选择“截断”为0大小。

但为了确保您可以在instrument中进行一些测试并检查堆跟踪。

文档状态:

设定长度: 将可变数据对象扩展或截断到给定长度。

- (void)setLength:(NSUInteger)length
参数 长度 接收器的新长度

讨论 如果可变数据对象被扩展,那么额外的字节将被零填充

可用性 在Mac OS X v10.0及更高版本中提供。 另见 –将长度增加: 相关示例代码 LSMSmart分类程序 声明于 NSData.h


所以我会选择“截断”为0大小。
但为了确保您可以在instrument中进行一点测试并检查堆跟踪。

苹果并不保证这里有任何特定的行为,但是根据我的经验,NSMutableData只会在容量上“增长”,它永远不会缩小。这意味着,如果您创建一个NSMutableData对象,向其添加10 MB的数据,然后将其长度设置为0,实际上它在内部仍会分配10 MB的存储空间,它只会报告其长度属性为0。这与您可以使用NSMutableArray监视的行为类似,也与您可以在其他编程语言中监视的行为相同(例如,大多数Java标准对象都是这样)

原因很简单:内存分配是一项昂贵的操作。不是非常贵,但通常不是O(1)。只改变长度是一个非常快的O(1)操作,因为它只需要改变一个实例变量。如果减少长度,并且NSMutableArray收缩其内部存储,则它必须执行重新分配,下次添加数据时,它必须再次执行重新分配。这意味着,如果希望使用尽可能少的内存,则不应将长度设置回零,而应创建一个新的NSMutableData并释放旧的NSMutableData。只有这样才能保证尽可能少的内存使用。缺点是,下次向其添加内存时,由于需要重新分配内存,这将是一个成本更高的操作。这是CPU与内存之间通常的权衡。允许代码使用的内存越少,它通常消耗的内存就越多;另一方面,允许一段代码使用的内存越多,它可以节省的CPU时间就越多

由于Mac通常有足够的内存,因此对于一个可变数据对象来说,重新分配其内部内存是没有好处的,至少如果这只会节省几MB内存的话。另一方面,如果将500 MB的数据对象收缩回零,它可能会真正重新分配。由于不保证任何行为,NSMutableData在iOS上的行为可能会大不相同,因为在iOS设备上,内存是一种受限制得多的资源。

苹果在这里不保证任何特定行为,但根据我的经验,NSMutableData只会在容量上“增长”,它永远不会缩小。这意味着,如果您创建一个NSMutableData对象,向其添加10 MB的数据,然后将其长度设置为0,实际上它在内部仍会分配10 MB的存储空间,它只会报告其长度属性为0。这与您可以使用NSMutableArray监视的行为类似,也与您可以在其他编程语言中监视的行为相同(例如,大多数Java标准对象都是这样)

原因很简单:内存分配是一项昂贵的操作。不是非常贵,但通常不是O(1)。只改变长度是一个非常快的O(1)操作,因为它只需要改变一个实例变量。如果减少长度,并且NSMutableArray收缩其内部存储,则它必须执行重新分配,下次添加数据时,它必须再次执行重新分配。这意味着,如果希望使用尽可能少的内存,则不应将长度设置回零,而应创建一个新的NSMutableData并释放旧的NSMutableData。只有这样才能保证尽可能少的内存使用。缺点是,下次向其添加内存时,由于需要重新分配内存,这将是一个成本更高的操作。这是CPU与内存之间通常的权衡。允许代码使用的内存越少,它通常消耗的内存就越多;另一方面,允许一段代码使用的内存越多,它可以节省的CPU时间就越多


由于Mac通常有足够的内存,因此对于一个可变数据对象来说,重新分配其内部内存是没有好处的,至少如果这只会节省几MB内存的话。另一方面,如果将500 MB的数据对象收缩回零,它可能会真正重新分配。由于没有行为保证,NSMutableData在iOS上的行为可能会完全不同,因为在iOS设备上,内存是一种更受限制的资源。

您是否按照VinceBurn的建议进行了测试?您是否按照VinceBurn的建议进行了测试?