Какой смысл в удержании сразу же после авто-релиза? - PullRequest
7 голосов
/ 15 октября 2010

Я смотрю на некоторый открытый исходный код и пытаюсь понять, почему автор сделал что-то определенным образом.

Класс является оберткой вокруг NSArray для создания структуры данных стека с push, pop и т. д.

Один метод - topObject, который возвращает самый верхний объект в стеке, и его реализация:

- (id)top {
    return [[[stack lastObject] retain] autorelease]; // stack is an instance of NSMutableArray
}

Что с сохранением, сопровождаемым немедленным автоматическим выпуском?

Моя первоначальная реакция состояла в том, что это предотвратило бы предупреждение анализатора об утечке памяти, но я проанализировал без сохранения / автоматического выпуска, и все еще не было никакого предупреждения.

Глядя на жизненный цикл, объект будетбыть создан, помещен в стек и освобожден, так что стеку принадлежит объект (базовый массив сохранит его при добавлении).

Так что я не понимаю использования здесь retain / autorelease ...

1 Ответ

9 голосов
/ 15 октября 2010

Давайте предположим, что top будет выглядеть следующим образом:

- (id) top {
    return [stack lastObject];
}

Затем представьте себе следующее:

foo = [bar top];
[bar removeAllObjects];
// Do something with foo

Произойдет следующее: вторая строка приведет к уменьшению количества сохраненных записей0, а в третьей строке foo будет указывать на освобожденную память.Но при значениях retain и autorelease количество сохраняемых единиц равно 1, пока пул не будет очищен, поэтому в третьей строке foo будет по-прежнему указывать на действительный объект.

...