Сравнить этот код
return [[title retain] release]; // releases immediately
с этим
return [[title retain] autorelease]; // releases at end of current run loop (or if autorelease pool is drained earlier)
Второй гарантирует, что у клиента будет необработанный объект для работы.
Это может быть полезно в такой ситуации (код клиента):
NSString *thing = [obj title];
[obj setTitle:nil]; // here you could hit retainCount 0!
NSLog(@"Length %d", [thing length]); // here thing might be dealloced already!
Сохранение (и использование autorelease
вместо release
) в вашем методе title
предотвращает взрыв этого кода. Автоматически освобожденный объект не будет вызывать свой метод release
до ПОСЛЕ ТОГО, ЧТО текущий стек вызовов завершен, выполняется (конец текущего цикла выполнения). Это дает всему клиентскому коду в стеке вызовов возможность использовать этот объект, не беспокоясь о том, что он будет освобожден.
Важно помнить: Это не Java, Ruby или PHP. Тот факт, что у вас есть ссылка на объект в переменной yer [sic], НЕ гарантирует, что вы не получите его из-под себя. Вы должны сохранить его, но тогда вам придется помнить, чтобы освободить его. Авто-релиз позволяет избежать этого. Вы должны всегда использовать авто-релиз, если вы не имеете дело со свойствами или циклами со многими итерациями (и, вероятно, даже тогда, если не возникает проблема).