Разница между NSMutableData mutableBytes и байтовыми методами - PullRequest
2 голосов
/ 17 марта 2012

Оба возвращают один и тот же указатель.Я знаю, - bytes принадлежит NSData, почему NSMutableData вводит - mutableBytes?Это просто для ясности кода, чтобы было более очевидно, что вы обращаетесь к изменяемым данным?Действительно ли имеет значение, какой из них используется?

NSMutableData* mydata = [[NSMutableData alloc] init];
[mydata appendData: [@"hello" dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"%p", [mydata mutableBytes]);
NSLog(@"%p", [mydata bytes]);

Спасибо.

Ответы [ 2 ]

3 голосов
/ 17 марта 2012

Есть несколько причин, по которым NSMutableData может предоставить отдельный метод mutableBytes:

  • Как вы предложили в своем вопросе, использование mutableBytes дает читателю понять, что вы хотите изменить данные.

  • Метод bytes возвращает const void *. Метод mutableBytes возвращает void *. Если вы хотите изменить байты, вам нужен void * без квалификатора const. Метод mutableBytes устраняет необходимость отбрасывать квалификатор const.

Теоретически может быть третья причина: метод -[NSData mutableCopy] может вернуть NSMutableData, который указывает на тот же буфер, что и исходный NSData, и создавать новую, изменяемую копию буфера только при вызове mutableBytes. Тем не менее, я не думаю, что он реализован таким образом на основе моего очень ограниченного тестирования.

0 голосов
/ 20 июня 2017

Одно дополнение к ответу грабителя и его комментарию:

@ Dabbu NSData и NSMutableData хранят свое содержимое как одно смежное массив байтов.

Следует помнить, что это поведение было изменено в iOS7: теперь NSData / NSMutableData не гарантирует сохранение содержимого как одного непрерывного массива. Может храниться в виде нескольких фрагментов.

Поэтому, когда вы вызываете bytes / mutableBytes, они копируют и сглаживают содержимое в один непрерывный массив байтов, если это необходимо, а затем возвращают указатель на этот непрерывный фрагмент.

В зависимости от того, что вы пытаетесь сделать, это может привести к неожиданному снижению производительности или чрезмерному потреблению памяти для больших буферов.

...