Должна ли переменная контроллера представления с освобождением свойства сохранять в viewDidUnload? - PullRequest
0 голосов
/ 31 марта 2011

Глядя на пример Apple ToolbarSearch, я вижу, что переменная searchBar их контроллера представления имеет свойство retain, и оно делает это:

searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 0.0)];

в разлочке контроллера, searchBar освобождается.Однако его viewDidUnload не освобождает, а просто устанавливает переменную searchBar в nil.

Я думал, что alloc увеличивает счетчик сохранения, а свойство retain переменной дополнительно увеличивает счетчик.Если это правда, не означает ли это, что searchBar должен быть освобожден в viewDidUnload?

Ответы [ 2 ]

1 голос
/ 31 марта 2011

Однако его viewDidUnload не освобождает, а просто устанавливает для переменной searchBar значение nil.

Это не так.У метода -viewDidUnload, на который вы ссылаетесь, есть строка:

self.searchBar = nil;

, которая передает nil установщику для свойства searchBar и эквивалентна:

[self setSearchBar:nil];

Сеттер для свойства retain отправляет release к старому значению и retain к новому.

1 голос
/ 31 марта 2011

Joey -

Атрибут 'retain' синтезированного свойства применяется только при вызове мутатора.Итак, если внешний класс называется:

[viewController setSearchBar:mySearchBar];

viewController вызовет сохранение на mySearchBar.Поскольку

searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 0.0)];

не проходит через мутатор (он просто изменяет переменную экземпляра searchBar напрямую), остается только счетчик сохранения одного объекта (из alloc).

, счет сохранения / выпуска в примере является правильным.+1 от alloc, -1 от release в реализации dealloc.

Если вы не уверены в разнице между -viewDidUnload и -dealloc, вот отличное объяснение: Что именно я должен делать вviewDidUnload

...