и сохраняют, и автоматически выпускают, функционально сохраняют объект, но они не объединяются .Разница заключается в том, что количество сохраняемых данных может быть уменьшено только другим объектом, тогда как количество автоматически выпущенных значений уменьшается автоматически при сливе NSAutoreleasePool.Если ни один другой объект не сохранил автоматически выпущенный объект к моменту истощения пула, он выходит из строя.
По сути, вы используете автоматический выпуск, когда хотите убедиться, что объект находится в текущем методе и может быть передан вдругие объекты, но вы не хотите отслеживать его выпуск самостоятельно.
В вашем примере кода авто-релиз является лишь мерой безопасности.Объект NSPredicate освобожден, потому что его работа завершена, но кодер хотел убедиться, что объект NSFetchRequest завис.Вам не нужно использовать «autorelease» в этом случае, но если вы потеряли количество своих выпусков, fetchRequest может исчезнуть.С другой стороны, вы не хотите, чтобы он оставался осиротевшим и протекающим, поэтому вы используете автоматическое освобождение для очистки, когда пул, в котором находится объект, сливается.
Наиболее распространенное использование автоматического выпуска - когда вы создаете переменное числообъектов каждый раз.Вы не хотите отслеживать их все, поэтому вы автоматически выпускаете их и позволяете бассейну позаботиться о них.(Более того, вы создаете локальный пул и сливаете его, как только закончите.)
В стандарте Apple API любой метод, который создает новый объект без ключевых слов «init», «new» или'create' возвращает автоматически выпущенный объект.
-[NSString initWithString:]
не является автоматическим выпуском, но - [NSString stringWithString:] есть.Это вызывает проблемы в средах, не связанных с сборкой мусора, поскольку stringWithString:
возвращает строку, которая, похоже, ведет себя как сохраненный объект, но позже она внезапно исчезнет, по-видимому, наугад, когда пул авто-выпусков был создан в стоках.
Edit01: из документов Apple
Пул автообновления является экземпляром NSAutoreleasePool, который «содержит» другие объекты, получившие сообщение автообновления;когда пул автоматического выпуска освобождается, он отправляет сообщение об освобождении каждому из этих объектов.Объект может быть помещен в пул автоматического выпуска несколько раз и получает сообщение о выпуске каждый раз, когда он помещается в пул.Таким образом, отправка автоматического выпуска вместо выпуска объекта продлевает время жизни этого объекта, по крайней мере, до тех пор, пока сам пул не будет освобожден (объект может просуществовать дольше, если он будет сохранен в промежуточный период).
СохранениеПодсчет и автоматическое высвобождение поддерживают объект живым с помощью одного и того же базового (но отдельного) механизма подсчета.Основное различие заключается в том, какой владелец объекта отправляет релиз.С оставшимися значениями это еще один объект, но для автоматически выпущенных счетчиков - это пул автоматического выпуска.