iPhone: повторное использование UIViewControllers для экономии памяти - PullRequest
3 голосов
/ 23 июня 2009

Каковы лучшие практики для повторного использования UIViewControllers? Во многих приложениях (включая собственные примеры Apple: например, SQLiteBooks) UIViewController выделяются и инициализируются каждый раз, а UIViewController помещается в стек. Это увеличивает использование памяти с каждым новым контроллером, потому что объекты остаются в памяти и больше не используются.

Как сделать лучше?

Ответы [ 5 ]

4 голосов
/ 23 июня 2009

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

Он должен быть освобожден, когда стек вытолкнут, если у вас нет чего-то другого, что его держит. Убедитесь, что ваши методы dealloc вызывают.

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

Таким образом, следуя стандартному шаблону, вы уже должны использовать память как можно меньше.

1 голос
/ 23 июня 2009

Не забывайте, что View Controller - это не ваше представление.

Представления, поддерживаемые контроллером представления, могут быть выгружены, поэтому сами контроллеры представления очень легковесны. Если вы хотите, чтобы занимаемая площадь была действительно легкой, вы можете аннулировать любые другие данные, которые контроллер выделил в viewDidUnload (в основном вызывается, когда есть предупреждение о памяти - хотя это только 3.0).

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

1 голос
/ 23 июня 2009

Установите точку останова в функции dealloc вашего контроллера представления и убедитесь, что она вызывается при удалении контроллера представления из окна. Память не должна продолжать накапливаться. Если вы правильно создаете и автоматически выпускаете свои контроллеры (как показано выше в LostInTransit), память для каждого контроллера должна быть освобождена при его удалении.

Если вы видите, что dealloc не вызывается, это означает, что где-то в приложении все еще существует ссылка на контроллер представления.

1 голос
/ 23 июня 2009

Это то, что я делаю при создании нового viewcontroller и освобождаю память, когда представление удаляется из окна

MyViewController *mvc = [[[MyViewController alloc] initWithNibName:@"MyView" bundle:nil] autorelease];
[[self navigationController] pushViewController:mvc animated:YES];
1 голос
/ 23 июня 2009

Есть ли у вас проблема с памятью, которую вы пытаетесь устранить, или это преждевременная оптимизация ? Я бы сказал, что если нет особых проблем с ресурсами, то лучше всего следовать стандартным шаблонам контроллера представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...