Более 1 объекта appDelegate? - PullRequest
       29

Более 1 объекта appDelegate?

2 голосов
/ 10 августа 2009

Исправляя сторонний код, я обнаружил действительно блестящую идею) Гай использовал 2 объекта appDelegate в xibs проекта. Я предполагаю, что он подумал, что это будет какой-то синглет или что-то подобное. Но после некоторого переосмысления этого куска кода я обнаружил, что на него нет технических ограничений. Вот мой пример: простой проект с navController и 2 представлениями. Каждый со своим viewController. Когда приложение запущено, первый экран отображается на экране. Когда пользователь нажимает кнопку, второй вид помещается в navController. На данный момент в MainWindow.xib есть объект appDelegate. Теперь, если вы добавите точно такой же объект appDelegate в xib второго представления. Теперь прямо при нажатии на второе представление вы можете видеть, что еще один экземпляр appDelegate создан и уничтожен (если вы переопределите методы init и dealloc и вставите туда журнал). Здесь я очень удивлен. Означает ли это, что может быть создан только один экземпляр appDelegte? Если да, то почему? appDelegate - это просто подкласс NSObject, реализующий протокол UIApplicationDelegate.

Ответы [ 4 ]

0 голосов
/ 24 ноября 2014

Я думаю, вы могли бы сделать что-то вроде этого:

  • Обратите внимание на старое UIApplication.delegate.
  • Создайте свой экземпляр UIApplicationDelegate со старым делегатом в качестве параметра.
  • Обязательно вызывайте старый делегат в каждом реализуемом методе.
  • Заставьте его вернуть старый делегат в методе - (id)forwardingTargetForSelector:(SEL)aSelector.
  • Замените [UIApplication sharedApplication].delegate на ваш.

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

0 голосов
/ 10 августа 2009

UIApplicationDelegate - это протокол, который не имеет состояния сам по себе, поэтому ничто не мешает иметь несколько из них. Сравните это с UIApplication, который имеет состояние и предоставляет одноэлементный метод доступа sharedApplication

Полностью можно заменить свойство делегата UIApplication на лету. Я не вижу большой выгоды, хотя.

0 голосов
/ 10 августа 2009

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

Вы можете иметь несколько объектов, которые реализуют протокол UIApplicationDelegate, но это обычно не делается, потому что 90% поведения будет идентичным во всех случаях.

0 голосов
/ 10 августа 2009

Объект appDelegate, созданный xCode в каждом проекте iphone, является точкой входа и выхода приложения. Не имеет смысла иметь более одного экземпляра этого класса, если вы знаете (помимо, возможно, потери некоторых настроек приложения), какому классу делегируется приложение? Почему вы можете сделать только один? Скорее всего, это связано с тем, что класс реализует шаблоны Singleton под крышками, поэтому убедитесь, что создан только один экземпляр делегата приложения. Держу пари, что даже при попытке выделить еще один из них сохраняется единственный исходный делегат приложения. Вероятно, вы можете копаться в документации и найти дополнительную информацию на сайте яблок по адресу http://developer.apple.com/iphone

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