Сохранение ссылки на iPhone UIViewController после нажатия - PullRequest
1 голос
/ 14 июля 2011

Мой вопрос заключается в следующем ... Каковы плюсы и минусы сохранения ссылки на UIViewController в предыдущем UIViewController UIViewController после того, как он был помещен в навигационный контроллер, и считается ли это хорошей практикой программирования. Вот код для демонстрации моего вопроса.

Сохранение ссылки

Заголовок

MainMenuViewController *mainMenuController;
@property (nonatomic, retain) MainMenuViewController *mainMenuController;

Главная

if (self.mainMenuController == nil)
{
    //Goto the next page
    MainMenuViewController *controller = [[MainMenuViewController alloc] init];
    self.mainMenuController = controller;
    [controller release];
}
[self.navigationController pushViewController:mainMenuController animated:TRUE];

Не хранит ссылку

MainMenuViewController *controller = [[MainMenuViewController alloc] init];
[self.navigationController pushViewController:controller animated:TRUE];
[controller release];

Ответы [ 6 ]

1 голос
/ 14 июля 2011

Сохранение ссылки больше относится к вашему использованию, чем к чему-либо еще. Если вы нажимаете на контроллер представления, который вы будете часто использовать в будущем, вы захотите сохранить ссылку на него. Однако, если это одноразовое представление, вы можете не захотеть его сохранять. Или вы можете сохранить его, чтобы загрузить его только один раз.

В качестве альтернативы, если у вас есть xib, загрузите представление для вас, тогда вы будете сохранять ссылку на представление, если вы не захотите перезагружать xib каждый раз, когда вы хотите его использовать.

Например, если вы загружаете представление с веб-представлением на нем в контроллер навигации. Вы можете загрузить его. установите URL, чтобы он загрузил страницу. А затем передайте его контроллеру навигации, когда вы позволите пользователю перемещаться по Интернету оттуда.

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

В любом случае вам придется провести это различие. Просто имейте в виду, что удержание слишком большого количества памяти даст вам предупреждение, в то время вам нужно будет расставить приоритеты относительно того, что вы хотите сохранить и от чего вы можете избавиться. Здесь дизайн приложения становится веселее:)

Надеюсь, это поможет. И удачи

1 голос
/ 14 июля 2011

Учитывая, что класс в вашем примере называется MainMenuViewController, я бы сказал, что в этом случае правильно сохранить объект живым, потому что это похоже на то, к чему пользователь будет возвращаться.Контроллеры представлений, как правило, легковесны и пропускают экранные представления, когда памяти становится мало, воссоздают их, когда они снова становятся видимыми.Вы должны привыкнуть настраивать что-либо (не только представления), которое можно обрабатывать аналогично в -viewDidLoad, и разрывать его в -viewDidUnload.

Если вы нажимали контроллер представления в результатевыбирая из динамического списка, как, например, приложение «Почта», когда вы выбираете сообщение, вы, вероятно, не потрудитесь сохранить ссылку, хотя вам может понадобиться сохранить один из них для самого последнего контроллера представления, чтобы быть более прощающим, еслипользователь по ошибке нажимает кнопку возврата, возвращаясь в то же состояние в подробном виде, как и раньше.

1 голос
/ 14 июля 2011

Трудно сказать, не зная больше о вашей реализации.

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

С другой стороны, если загрузка представления и / или контроллера по какой-то причине стоит дорого, и выВы уверены, что пользователь будет часто получать к нему доступ, удерживая контроллер представления, может быть хорошей идеей и сделать ваше приложение более отзывчивым.

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

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

if (!self.mainMenuController)

0 голосов
/ 14 июля 2011

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

Как правило, при использовании UINavigationController каждый контроллер представления не должен делать предположений о типе своего родительского контроллера представления.

В лучшем подходе используется шаблон делегата / протокола.

Заголовок

@protocol MainViewControllerProtocol;
@interface MainViewController : UIViewController {
    id <MainViewControllerProtocol> delegate
}
    @property (nonatomic, assign) id <MainViewControllerProtocol> delegate;
@end

@protocol MainViewControllerProtocol <NSObject>
    - (void)somethingHappened;
@end
0 голосов
/ 14 июля 2011

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

0 голосов
/ 14 июля 2011

Это зависит от требований приложения. Предположим, что вы хотите добавить или удалить что-то в главном контроллере после того, как перед загрузкой стека навигации мы уже можем выделить mainController и делать с ним все, что хотим. Я на примере расскажу, что я делаю в моем случае, мне нужно показать некоторые данные в tableView, скажем, tableView находится в viewController2, и я получаю источник данных этой таблицы на viewController1, поэтому перед тем, как я нажимаю viewController2, я инициализирую viewController2, сохраняя его ссылку и назначить источник данных для viewController2 и перезагрузить таблицу. Это моя причина, чтобы сохранить ссылку.

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