Под ARC, я должен все еще обернуть @autoreleasepool вокруг условия while?
Да. Автозапуск Бассейны все еще на месте, и растут и всплывают как прежде. Компилятор просто добавляет и объединяет необходимые операции сохранения и освобождения, когда ARC включен (повторяет логан), на основе методов, которые видимы для TU, и соглашений об именах по умолчанию.
Выполнение в ARC практически идентично ручному подсчету ссылок: стеки пулов автоматического выпуска все еще существуют. Одно из отличий состоит в том, что компилятор может упорядочить операции подсчета ссылок несколько отличным от того, как вы его написали (не неправильно), и может пропустить ненужные циклы сохранения.
Лучше ли, когда это возможно, предпочитать методы initWith ...
WRT, минимизирующий рост кучи по сравнению с автоматически выпущенными аналогами: Да. Это всегда было так. Это особенно важно на устройствах iOS, где память довольно ограничена.
Исключением является случай, когда объект может избежать выделения. Пример:
NSString * copy = [NSString stringWithString:arg];
в этом случае copy
может быть [[arg retain] autorelease]
. Обратите внимание, что в этом случае copy
по-прежнему автоматически высвобождается, но обычно не стоит слишком долго проверять наличие таких оптимизаций. Примечание: здесь также лучше использовать copy = [arg copy]
... [arg release]
.
Другим бонусом является то, что дисбалансы вашего счета часто обнаруживаются раньше, когда объект никогда не освобождается автоматически, и ближе к месту вызова (а не тогда, когда пул автоматического освобождения окончательно выталкивается).
Производительность с большими пулами авто-релизов на самом деле намного хуже, чем может показаться большинству людей. Если вы можете избежать их сильной зависимости (например, используя alloc
+ init
... + release
), вы можете значительно ускорить свою программу. Явное создание пулов автоматического выпуска является дешевым и может помочь минимизировать эту проблему. Если выделения велики и / или многочисленны, по возможности избегайте использования на них autorelease
и оборачивайте эти разделы в явные пулы автоматического выпуска.