Что такое AppDelegates в Objective-C? - PullRequest
4 голосов
/ 22 октября 2009

Я работаю над учебным пособием для iPhone ( текст ссылки ), и оно заставляет меня вставить некоторый код (несколько раз в различных учебниках), но он не объясняет его вообще. В этом коде:

todoAppDelegate *appDelegate = (todoAppDelegate *)[[UIApplication sharedApplication] delegate];

Что такое appDelegate? Что означает «делегат» в конце реализации? На самом деле, что все это значит? (UIIapplication sharedApplication)?

Я программист .Net, если это помогает кому-то объяснить это лучше. Я ненавижу изучать учебники, потому что мне всегда нужно знать, что делает ВСЕ, и никто не все объясняет.

Ответы [ 3 ]

18 голосов
/ 22 октября 2009

Давайте вернемся немного назад.

Квадратные скобки ([ ]) - это синтаксис вызова метода Objective-C. Так что, если у Cocoa есть синтаксис C #, эквивалентный синтаксис будет:

TodoAppDelegate appDelegate = UIApplication.sharedApplication.delegate;

В C # вы бы использовали статический класс для класса, который имеет только один экземпляр. В Какао шаблон Singleton используется для достижения этой цели. Метод класса (в данном случае sharedApplication) используется для извлечения одного экземпляра этого класса.

Делегаты в Какао не похожи на ключевое слово delegate в C #, так что не смущайтесь. В C # вы используете ключевое слово delegate для ссылки на метод. Шаблон делегата в Какао предоставляется в качестве альтернативы подклассам.

Многие объекты позволяют вам указать другой объект в качестве делегата. Делегаты реализуют методы, которые эти объекты будут вызывать, чтобы уведомить их об определенных событиях. В этом случае UIApplication - это класс, представляющий текущее работающее приложение (например, System.Windows.Forms.Application). Он отправляет сообщения своему делегату, когда происходят вещи, которые влияют на приложение (например, когда приложение запускается, выходит, получает или теряет фокус и т. Д.)

Еще одна концепция Objective-C - это protocol. В принципе он аналогичен .NET interface, за исключением того, что методы могут быть помечены как @optional, что означает, что их классы не требуются для реализации методов, помеченных таким образом. Делегаты в iPhone SDK - это просто объекты, которые соответствуют определенному протоколу. В случае UIApplication, делегаты протокола должны соответствовать: UIApplicationDelegate.

Поскольку не требуется реализовывать каждый метод, это дает делегату гибкость в выборе того, какие методы стоит реализовать. Если вы хотите, например, выполнить некоторые действия после завершения запуска приложения, вы можете реализовать класс, соответствующий протоколу UIApplicationDelegate, установить его как delegate экземпляра UIApplication, а затем реализовать applicationDidFinishLaunching:.

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

В приложениях для iPhone разработчики также часто используют делегат приложения в качестве объекта верхнего уровня. Поскольку вы обычно не подкласс UIApplication, большинство разработчиков хранят свои глобальные данные приложения в делегате приложения.

4 голосов
/ 22 октября 2009

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

И это не экземпляр. Фрагмент, который вы разместили выше, ничего не создает. Он получает доступ к любому объекту, установленному в качестве делегата приложения. [UIApplication sharedApplication] получает объект, представляющий приложение, а отправка delegate приложению получает его делегата (если есть).

2 голосов
/ 22 октября 2009

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

Итак, допустим, у вас есть объект A, и вы можете назначить ему делегата (назовем его DelegateObject).

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

Таким образом, вместо того, чтобы objectA реализовывал метод для всех этих экземпляров, мы скажем ... давайте возьмем другой объект, DelegateObject, выполним работу ... и до тех пор, пока результаты возвращаются в правильном формате, мы не волнует, что делегатОбъект сделал, чтобы туда добраться.

objectA сначала проверит, что DelegateObject существует, и что DelegateObject реализовал метод для выполнения запрашиваемой работы.

Для этого NSObject (от которого наследуется каждый объект Какао) имеет следующий метод:

- (BOOL)respondsToSelector:(SEL)aSelector

и objectA выполнит простой тест перед отправкой сообщения на DelegateObject, например:

if ([delegate respondsToSelector: @selector(someMethod:sender:)])

    {
        [delegate someMethod:@"stuff" sender:self];
    }

и поскольку objectA отправляет сообщение своему делегату, только если он был назначен, делегат не сохраняется объектом A.

если бы мы использовали UITableView в качестве примера, у него было бы много методов UITableViewDelegate. Один из них:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

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

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