30

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

4

4 回答 4

76

请参阅以下方法的文档:

- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength

苹果明确表示:

如果范围的长度不等于replacementLength,则调整接收器的大小以容纳新字节。接收器中超出范围的任何字节都会被移动以适应新字节。因此,您可以为 replacementBytes 传递 NULL,为 replacementLength 传递 0,以删除范围范围内接收器中的字节。您还可以用比范围长度更多的字节替换范围(可能是零长度),这具有插入的效果(或“替换一些并插入更多”)。

要从末尾删除 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 对象。

于 2010-08-03T21:58:37.313 回答
3

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

NSMutableData *data = ...
CFDataDeleteBytes((CFMutableDataRef)data, CFRangeMake(3, 4));
于 2010-02-27T00:21:00.327 回答
1

如果要删除的数据位于末尾,则可以使用

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

或者使用 obj-c 2.0 语法

NSMutableDataInstance.length -= n;

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

于 2010-02-27T00:24:34.877 回答
0

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

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

这很好用。

于 2013-03-31T09:52:13.713 回答