NSMutableData删除字节?

时间:2010-02-27 00:02:48

标签: objective-c nsdata nsmutabledata

我可以使用appendData方法轻松地向NSMutableData实例添加字节,但是我没有看到任何类似的删除数据的方法?我忽略了什么,或者我是否需要创建一个新对象并仅复制我需要的字节?

4 个答案:

答案 0 :(得分:72)

请参阅以下方法的文档:

- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength
Apple明确表示如下:

  

如果范围的长度不等于   replacementLength,接收器是   调整大小以容纳新字节。   接收器中超出范围的任何字节   被转移以适应新的   字节。因此,您可以传递NULL   replacementBytes和0表示   replacementLength删除中的字节   范围范围内的接收器。您   也可以替换一个范围   比零长度更多的字节比   范围的长度,有   插入的影响(或“替换一些   并插入更多“)。

要从末尾删除10个字节,请使用:

[data setLength:[data length] - 10];

它也可以通过replaceBytesInRange来完成,但事实上它要快得多,因为字节并没有真正被删除。而是仅更改内部大小变量,并且NSMutableData的行为就像删除了字节一样。 IOW,这是一个O(1)操作(这意味着无论你移除了多少字节,它总是需要相同的长时间执行),而且速度非常快。

要从前面删除10个字节,请使用:

[data replaceBytesInRange:NSMakeRange(0, 10) withBytes:NULL length:0];

要删除中间的10个字节(例如,在20个字节之后),请使用:

[data replaceBytesInRange:NSMakeRange(20, 10) withBytes:NULL length:0];
但是,

replaceBytesInRange是一个O(n)操作。这意味着无论移除100个字节需要多长时间,移除200个字节需要两倍的时间,依此类推。它仍然非常快,仅受计算机内存(RAM)吞吐量的限制。如果您有10 MB的数据,并从前面删除1 MB,则复制9 MB以填补刚刚删除的MB的间隙。因此,操作的速度取决于系统将9 MB RAM从一个地址移动到另一个地址的速度。除非你处理包含数百MB的NSMutableData对象,否则这通常足够快。

答案 1 :(得分:3)

由于NSMutableData使用CFMutableDataRef进行免费桥接,因此您可以使用CFDataDeleteBytes()函数:

NSMutableData *data = ...
CFDataDeleteBytes((CFMutableDataRef)data, CFRangeMake(3, 4));

答案 2 :(得分:1)

如果要删除的数据在最后,则可以使用

[NSMutableDataInstance setLength:[NSMutableDataInstance length] - n];

或使用obj-c 2.0语法

NSMutableDataInstance.length -= n;

对于比我建议操作原始数据更复杂的事情。

答案 3 :(得分:0)

我看到这个帖子有答案,但不过这可能是有价值的补充。要从NSMuttableData中删除所有字节,您可以创建新数据并将其复制到原始数据:

[myData setData:[NSData dataWithBytes:NULL length:0]];

这很有效。