Добавление UIViewController в стек UINavigationController - правильный подход - PullRequest
1 голос
/ 20 ноября 2010

Мне просто интересно узнать о следующих 2 подходах.

Первый:

    SomeViewController *someViewController = [[SomeViewController alloc] init];
    [self.navigationController pushViewController:someViewController animated:YES];
    [someViewController release];

Второй:

SomeViewController *someViewController = [[SomeViewController alloc] init];
self.iVarViewController = someViewController;
[someViewController release];
[self.navigationController pushViewController:self.iVarVierController animated:YES];

Можно ли использовать первый подход или всегда пытаться принять второй?Что именно не так с первым подходом?Когда «someViewController» помещается в стек, увеличивается ли его счет сохранения, и поэтому он никогда не освобождается полностью?Вот почему вы можете присвоить его свойству, как при втором подходе?Но при втором подходе вы не можете быть уверены, когда он будет выпущен.

Я прочитал аналогичный пост , но я все еще немного не уверен, поэтому подумал, что я бы спросил еще проще.

Ответы [ 2 ]

1 голос
/ 20 ноября 2010

Они оба в порядке.Когда вы помещаете SomeViewController в стек, его счетчик увеличивается.Когда он выталкивается из стека, его счетчик хранения снова уменьшается.Вам не нужно явно выпускать его самостоятельно потом.Фактически, это может вызвать исключение.

Существует простое общее правило: всякий раз, когда вы звоните alloc/retain/new/copy*, вам нужно как-нибудь позвонить release.

Вы звоните толькоalloc один раз здесь, поэтому вам нужно вызывать release только один раз.

Редактировать: во втором подходе вы неявно вызываете retain с помощью установщика.Так что в этом случае вам понадобится дополнительный release, чтобы предотвратить утечку памяти.

0 голосов
/ 20 ноября 2010

Последствия двух подходов немного отличаются.В первом случае экземпляр SomeViewController и его представление будут освобождены, как только экземпляр будет извлечен.Во втором случае экземпляр SomeViewController будет храниться в памяти, пока он не будет заменен новым (self.iVarViewController = someViewController).

Второй подход может иметь смысл, если первый контроллер представления должен отправлять сообщениявторой (например, для получения измененных значений свойств) после извлечения второго контроллера.Однако в этом случае вам придется спросить себя, имеет ли смысл каждый раз воссоздавать объект, а не просто повторно использовать экземпляр, сохраненный в свойстве (ivarViewController в вашем примере).Лучше, чем другие, зависит от комбинации ожидаемых шаблонов использования для этой части вашего приложения, а также от характеристик производительности второго контроллера и его вида.(Например, сколько памяти занимают объекты и как часто пользователи обычно переключаются между двумя контроллерами?)

...