Вопрос

Я могу легко добавить байты в экземпляр nsmutabledata, используя appendData Метод, однако, я не вижу подобного метода для удаления данных? Я что -то упускаю из виду, или мне нужно создать новый объект и копировать только байты, которые мне нужны?

Это было полезно?

Решение

Пожалуйста, смотрите документацию следующего метода:

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

Apple четко говорит следующее:

Если длина диапазона не равна замене длины, приемник изменяется для размещения новых байтов. Любые байты прошлого диапазона в приемнике смещены, чтобы приспособить новые байты. Поэтому вы можете пройти NULL для замены и 0 для замены длины для удаления байтов в приемнике в диапазоне диапазона. Вы также можете заменить диапазон (который может быть нулевой длиной) большим количеством байтов, чем длина диапазона, который имеет эффект вставки (или «заменить некоторые и вставить больше»).

Чтобы удалить 10 байт с конца, используйте:

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

Это также можно сделать с помощью replybytesinrange, но на самом деле это намного быстрее, потому что байты на самом деле не удалены. Вместо этого изменяется только внутренняя переменная размера, и 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];

replybytesinrange - это операция O (n), хотя. Это означает, что независимо от того, сколько времени потребуется, чтобы удалить 100 байтов, потребуется вдвое больше времени, чтобы удалить 200 байтов и так далее. Это все еще довольно быстро и ограничено только пропускной способностью памяти вашего компьютера (ОЗУ). Если у вас есть 10 МБ данных, и вы удаляете 1 МБ с передней части, 9 МБ копируются, чтобы заполнить разрыв только что удаленного MB. Таким образом, скорость операции зависит от того, насколько быстро ваша система может перемещать 9 МБ оперативной памяти с одного адреса на другой. И это обычно достаточно быстро, если только вы не имеете дело с объектами nsmutabledata, содержащими сотни МБ.

Другие советы

Должен быть предложенным приемником событий, который будет добавлять тип содержимого программно в библиотеку, посмотрите, если есть какие-либо

Если данные, которые вы хотите удалить, находятся в конце, вы можете использовать

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

или с синтаксисом OBJ-C 2.0

NSMutableDataInstance.length -= n;

Для чего -либо более сложного, чем я рекомендую манипулировать необработанными данными.

Я вижу, что в этом ветке есть ответ, но, тем не менее, это может быть ценным добавлением. Чтобы удалить все байты из nsmuttabledata, вы можете создать новые данные и скопировать их на оригинал:

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

Это прекрасно работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top