Ответ 1
См. документацию по следующему методу:
- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength
Apple четко заявляет следующее:
Если длина диапазона не равна replacementLength, приемник для изменения новых байтов. Любой байтовый пробел в приемнике смещены для размещения новых байт. Поэтому вы можете передать NULL для replacementBytes и 0 для replaceLength для удаления байтов в приемник в диапазоне диапазона. Вы также может заменить диапазон (который может быть нулевой длиной) с большим количеством байтов, чем длина диапазона, которая имеет эффект вставки (или "заменить некоторые и вставить больше" ).
Чтобы удалить 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 байт и так далее. Он все еще довольно быстрый и ограничен только пропускной способностью вашей компьютерной памяти (ОЗУ). Если у вас 10 МБ данных, и вы удаляете 1 МБ спереди, 9 МБ копируются, чтобы заполнить пробел только что снятого МБ. Таким образом, скорость операции зависит от того, насколько быстро ваша система может перемещать 9 МБ ОЗУ с одного адреса на другой. И это обычно достаточно быстро, если вы не имеете дело с объектами NSMutableData, содержащими сотни МБ.