В своих книгах я всегда говорил, что второй способ - лучший. Но в прошлом некоторые люди не соглашались, особенно. на iOS. Какая разница?
- Есть ли разница?
Оба варианта выделяют объект. Оба варианта заботятся о его выпуске. («Autorelease является выпуск»). Но они делают это в разные моменты времени:
- Вариант: Объект выпущен в конце ARP, по крайней мере, в конце runloop.
- Вариант 2: Объект немедленно освобождается
release
.
(оба: если нет дополнительной ссылки.)
- Почему мне нужно -autorelease?
Бывают ситуации, когда release
невозможен без нарушения правил MM. Самый простой случай заключается в том, что вы хотите вернуть выделенный объект. Кто должен его отпустить? Способ создания? Это вернет что-то потенциально освобожденное. Метод, который отправил сообщение? Это привело бы к дисбалансу +1 методов, таких как alloc
с -1 методами вроде release
. Нет выхода.
Пример:
- (NSString*)fullName
{
NSString *fullName = [[NSString alloc] initWithFormat:@"%@, %@", self.lastName, self.firstName];
return fullName; // Who balance +alloc?
}
По autoreleasing объекта, ваш метод остается сбалансированным и может безопасно вернуть объект.
В других случаях это удобный способ избавиться от зависимостей. Представьте себе этот код:
Person *person = …;
NSString *name = person.name;
[person release], person=nil; // Imagine that this will dealloc the instance.
// name is invalid, because person released it.
С autorelease
у вас нет этой проблемы. Существует несколько решений:
Геттер отправляет retain
, autorelease
в возвращаемое значение. Существует дополнительная ссылка в ARP preventig строку из dealloction:
- (NSString*)name
{ return [[_name retain] autorelease]; }
Или тот, кто использует метод делает это:
NSString *name = [[person.name retain] autorelease];
Следующая проблема с проблемой с release
том, что он труднее использовать return
, break
или continue
:
while (…)
{
id object = [[Class alloc] …]
if (…)
{
break;
}
[object release];
}
Там нет никаких проблем с autoreleas е.
Далее: По некоторым причинам рекомендуется использовать распределители удобностей, если они существуют. Объекты, возвращенные оттуда, не могут быть выпущены явно, поэтому код для отказа от ссылки имеет зависимость от того, как была установлена ссылка. Почему бы не использовать autorelease все время?
- Что является недостатком autorelease
Удаление объекта потенциально отложено, так что вы можете получить проблемы с объемом памяти.Но я лично считаю, что @autorelease{}
- лучшее решение для этого, чем release
.
Почему вы не используете ARC? – NAZIK
Чтобы эффективно использовать ARC, я хочу сначала изучить Руководство по управлению памятью. – esh