2016-05-06 4 views
3

Under ARC, будет removeAllObjects на NSMutableArray быть более интенсивным для CPU (рилизинг объектов по отдельности явно), чем просто делать myArray = [NSMutableArray new]; и просто позволить ARC поймать всю освобожденную память-блок на это следующий раунд релиза ?NSMutableArray removeAllObjects против нового при повторном использовании

Я мог бы проверить это с помощью двух частей кода, но из-за оптимизации и тому подобного мне действительно интересно узнать о механизме. С точки зрения C это похоже на то, что вызывать все объекты, которые будут выпущены, звучат более интенсивно, но, возможно, дерево dealloc в Objective-C может быть достаточно эффективным для ARC, чтобы сделать это на равной скорости?

ответ

3

Некоторый код должен пройти через этот массив внутри NSMutableArray и позвонить по номеру release на все его объекты без nil. Если есть разница между тем, что делает код, внутри ARC или внутри NSMutableArray, это не должно быть заметно, потому что дорогая часть не является накладной линией цикла, это фактический вызов release и возможное освобождение после него.

Существует более существенное различие: при вызове removeAllObjects массив сохраняет внутреннее хранилище, поэтому при следующем запуске приложения ему не придется увеличивать свой внутренний размер. Если ваш шаблон использования вызывает повторное добавление большого количества элементов в один и тот же массив, вызов removeAllObjects может сэкономить вам некоторые циклы распределения/перераспределения.

+0

Это имеет смысл, спасибо! У меня только 2 действительно больших массива, которые назначили бы многие (тысячи) записей. Я собираюсь сделать некоторые конкретные тесты, чтобы убедиться, что это будет иметь значение с точки зрения производительности (даже если это маргинальный номер), чтобы повторно использовать их с 'removeAllObject'. –