Apple не гарантирует какого-либо особого поведения здесь, однако, насколько мне известно, NSMutableData будет только "увеличиваться" в объеме, он никогда не будет уменьшаться.Это означает, что если вы создаете объект NSMutableData, добавляете к нему 10 МБ данных, а затем устанавливаете его длину равным 0, на самом деле внутреннему пространству для хранения будет выделено 10 МБ, он просто сообщит 0 для своего свойства длины.Это аналогичное поведение, которое вы можете отслеживать с помощью NSMutableArray, и такое же поведение, которое вы можете отслеживать в других языках программирования (например, большинство стандартных объектов Java ведут себя таким образом).
Причина этого проста: выделение памяти является дорогостоящимоперация.Не очень дорого, но обычно это не O (1).Только изменение длины является очень быстрой операцией O (1), так как нужно только изменить переменную экземпляра.Если вы уменьшите длину, а NSMutableArray сократит свое внутреннее хранилище, ему придется выполнить перераспределение, и в следующий раз, когда вы добавите данные, ему придется снова выполнить перераспределение.Это означает, что если вы хотите использовать как можно меньше памяти, вам не следует устанавливать нулевую длину, вместо этого создайте новый NSMutableData и освободите старый.Только это гарантирует минимальное использование памяти.Недостатком является то, что в следующий раз, когда вы добавите в него память, это будет намного более дорогой операцией, поскольку необходимо перераспределение.Это обычный обмен ЦП с памятью.Чем меньше памяти вы позволяете использовать фрагменту кода, тем больше памяти он обычно использует;с другой стороны, чем больше памяти вы позволяете использовать фрагменту кода, тем больше процессорного времени он может сэкономить.
Поскольку у Mac обычно достаточно памяти, он не окупается за изменяемый объект данных,перераспределить его внутреннюю память, по крайней мере, если это сэкономит только пару МБ.С другой стороны, он может действительно перераспределиться, если вы уменьшите 500 МБ объекта данных до нуля.И поскольку поведение не гарантируется, NSMutableData может вести себя совсем по-другому на iOS, потому что на устройствах iOS память является гораздо более ограниченным ресурсом.