iOS, используйте AppDelegate в InterfaceBuilder, созданы два экземпляра

В приложении iOS я реализовал некоторую логику приложения в файле AppDelegate.

Несколько контроллеров представления и т. д. должны вызывать AppDelegate, поэтому я поместил AppDelegate в Interface Builder, дал ViewControllers IBOutlet AppDelegate* и нарисовал ссылку на него.

В приложении, которое я сейчас вижу, создается два экземпляра AppDelegate, один из которых вызывается и получает все уведомления, а другой связан с ViewControllers.

Поэтому я изменил свое приложение для использования в ViewControllers:

app_del = (AppDelegate*)[[UIApplication sharedApplication] delegate].

Тогда я называю это appDelegate. Но это также другой экземпляр, чем тот, который получает уведомления. Кто-нибудь может объяснить, почему?

Кто-нибудь может сказать мне, что происходит не так? Мое подозрение из поиска в Google заключается в том, что iOS создает экземпляр AppDelegate, а Interface Builder не знает об этом и создает другой? Это правильно?

Может ли кто-нибудь дать мне подсказку о том, как лучше всего создавать/планировать экземпляры в Interface Builder и в каком порядке они создаются в приложении при запуске и в каком уведомлении я могу полагаться на то, что все они созданы?

Спасибо за любые подсказки, Торстен.


person Torsten Mohr    schedule 24.11.2012    source источник


Ответы (1)


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

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

Чтобы получить указатель на делегат приложения, используйте этот метод:

[[UIApplication sharedApplication] delegate];

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

person jrturton    schedule 24.11.2012