我可以使用appendData
方法轻松地向NSMutableData实例中添加字节,但是我没有看到任何类似于删除数据的方法。是我忽略了什么,还是需要创建一个新对象并仅复制我需要的字节?
appendData
方法轻松地向NSMutableData实例中添加字节,但是似乎没有类似的方法用于删除数据。我是否忽略了某些内容? 如果要删除数据,您可能需要创建一个新对象,并仅复制所需的字节。请注意保留HTML标记。我可以使用appendData
方法轻松地向NSMutableData实例中添加字节,但是我没有看到任何类似于删除数据的方法。是我忽略了什么,还是需要创建一个新对象并仅复制我需要的字节?
appendData
方法轻松地向NSMutableData实例中添加字节,但是似乎没有类似的方法用于删除数据。我是否忽略了某些内容? 如果要删除数据,您可能需要创建一个新对象,并仅复制所需的字节。请注意保留HTML标记。请参阅以下方法的文档:
- (void)replaceBytesInRange:(NSRange)range
withBytes:(const void *)replacementBytes
length:(NSUInteger)replacementLength
苹果公司的文档中如下所述:
如果范围的长度与
replacementLength
不相等,则会调整接收器的大小以容纳新的字节。 接收器中范围之后的所有字节都将被移动以容纳新的字节。因此,您可以传递NULL
作为replacementBytes
和0
作为replacementLength
来删除范围内的字节。您还可以用比范围长度更多的字节替换范围(可能是零长度),这会产生插入效果(或“替换一些并插入更多”)。
要从末尾删除10个字节,请使用:
data.length = data.length - 10;
也可以通过replaceBytesInRange
来实现,但实际上速度要快得多,因为字节并没有真正被移除。相反,只有内部大小变量被更改,NSMutableData
将表现为字节已被移除。即,这是一个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)的操作。执行此操作所需的时间取决于数据对象包含的字节数以及您要移除的位置,因为移除位置右侧的所有字节都必须向左移动。尽管如此,它仍然相当快,只受计算机内存(RAM)吞吐量的限制。如果您有10 MB的数据,并从前面删除1 MB,则将复制9 MB以填补刚刚删除的1 MB的空缺。因此,操作的速度取决于您的系统可以多快地将9 MB的RAM从一个地址移动到另一个地址(在我的系统上,这需要0.2毫秒才能完成9MB的移动)。
由于NSMutableData与CFMutableDataRef之间是toll-free bridged,因此您可以使用CFDataDeleteBytes()函数:
NSMutableData *data = ...
CFDataDeleteBytes((CFMutableDataRef)data, CFRangeMake(3, 4));
如果您要删除的数据位于末尾,可以使用
[NSMutableDataInstance setLength:[NSMutableDataInstance length] - n];
或使用 obj-c 2.0 语法
NSMutableDataInstance.length -= n;
对于比这更复杂的任何事情,我建议操纵原始数据。
我看到这个线程有答案,但是这可能是有价值的补充。要从NSMuttableData中删除所有字节,您可以创建新的Data并将其复制到原始数据中:
[myData setData:[NSData dataWithBytes:NULL length:0]];
这个很棒。