7

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

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

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

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

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

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

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

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

ответ

9

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

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

Тогда представьте себе:

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

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

+0

Имеет смысл, спасибо. – Jasarien

+4

Это все еще не правильно, что это imho. В Руководстве по программированию управления памятью указано: «Так же, как вы не должны беспокоиться о фактическом значении сохранения объекта, вы не должны беспокоиться о том, что объект, возвращаемый вам, автореализован или нет. Единственное, что вас беспокоит, не." - поэтому сохранение + автореклама должно происходить в foo = [верхняя панель]; line, а не в методе - (id) top {}. –

+0

Хорошо объясненный ответ. –

Смежные вопросы