В Какао делегат - это объект, к которому другой объект обращается с вопросами о поведении и сообщает об изменениях в его состоянии. Например, UITableViewDelegate отвечает за ответы на вопросы о том, как должен вести себя UITableView при выполнении выбора или переупорядочении строк. Это объект, который UITableView запрашивает, когда он хочет знать, какой высоты должна быть конкретная строка. В парадигме Model-View-Controller делегаты являются контроллерами, а имена многих делегатов заканчиваются на «Controller».
Имея риск заявить об очевидном, UIApplicationDelegate является делегатом для UIApplication. Эта связь немного более очевидна в Cocoa (Mac), чем в Cocoa Touch (iPhone), поскольку делегат NSApplication может более непосредственно контролировать поведение NSApplication (например, предотвращая завершение приложения). iPhone не дает большого контроля над UIApplication, поэтому в основном UIApplicationDelegate информируется об изменениях, а не об активном процессе принятия решений.
UIApplicationDelegate не всегда доступен везде в приложении. Одноэлементное приложение UIApplication ([UIApplication sharedApplication]), и с его помощью вы можете найти его делегата. Но это не означает, что для каждого объекта в приложении целесообразно напрямую общаться с делегатом приложения. В целом, я не рекомендую разработчикам разговаривать с делегатом приложения случайными объектами. Большинство проблем, которые решаются таким образом, лучше решать с помощью Singletons, NSNotification или других объектов делегатов.
Что касается его создания, то в Mac нет ничего волшебного в делегате приложения. В большинстве случаев это просто объект, созданный и подключенный NIB. На iPhone, однако, делегат приложения может быть немного волшебным, если создается UIApplicationMain (). Четвертый параметр - это NSString, указывающий класс делегата приложения, и UIApplicationMain () создаст его и установит в качестве делегата sharedApplication. Это позволяет вам установить делегата без NIB (что очень сложно для Mac). Если четвертый параметр для UIApplicationMain () равен nil (как в шаблонах Apple), то делегат создается и подключается основным NIB, как и главное окно.