我可以使用appendData
方法轻松地将字节添加到NSMutableData实例,但是我看不到任何类似的方法来删除数据吗?我是否正在忽略某些内容,还是需要创建一个新对象并仅复制所需的字节?
最佳答案
请参阅以下方法的文档:
- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)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对象。
关于objective-c - NSMutableData删除字节?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2345626/