2009-08-10 3 views
2

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

ответ

0

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

0

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

Должно быть полностью заменено свойство делегата UIApplication на лету. Однако я не вижу большой пользы.

0

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

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

0

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

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

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