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