Ну, ваше понимание совершенно верно. С ARC мы больше не выпускаем и не выпускаем автоматически. Просто убедитесь, что мы присваиваем nil (или другое разумное значение) любой ссылке на объекты, которая нам больше не нужна. В худшем случае мы все еще могли бы постоянно потреблять дополнительную память, но память не может пропускать руду.
И да, мы по-прежнему поддерживаем пулы автоматического выпуска для использования библиотек фреймворков (связанных), которые могут не использовать ARC.
Чтобы ответить на ваш вопрос между строк о цели авто-выпуска. Конечно, это относится только к не-ARC проектам.
В старые добрые времена Objective-C не предлагал подсчета ссылок, но сохранял подсчет. Любая выделенная память объектов, которые не сохранены (или имеют счет сохранения 0), считается свободной и может вскоре потребоваться и использоваться другими объектами.
Это означает, что каждый объект должен быть сохранен после его размещения, при условии, что вы хотите сохранить его. Когда объект больше не используется, вам нужно освободить его. Это связано с двумя рисками. Что ж, alloc сохраняет его один раз автоматически.
1) Вы можете забыть освободить объект, который не используется. В худшем случае вы можете даже потерять все ссылки на объект, который с тех пор остается в памяти.
2) Вы все еще можете сослаться на объект, который уже был освобожден, и затем попытаться получить к нему доступ, что, скорее всего, закончится исключением BAD_EXC.
Все это может быть довольно раздражающим. Для того, чтобы избавиться от некоторых из этих обязательств для объектов, которые не остаются вокруг очень долго, был изобретен авторелиз. Только для временных объектов вы размещаете его (release-count = 1) и автоматически выпускаете его. Это означает, что объект будет автоматически освобожден (количество участников уменьшится на 1) в следующем круге автоматического выпуска. Но объект остается выделенным для вашего метода, пока он выполняется. Обычно ссылочная переменная будет локальной.
Образец:
-(void) myMethod{
AClass *someObject = [[[AClass alloc] init] autorelease];
// use the object
// probably hand it to another object if that takes ownership, i.e. add it ot an Array using addObject:
// don't care any more
}
И это больше не требуется при использовании ARC.