чтобы добавить больше к смеси ответов и с другой точки зрения, делегаты - это объекты, которые могут (но не обязательно) работают для другого объекта.
Итак, допустим, у вас есть объект 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 пойдет своим путем, независимо от того, что делает делегат. И если нет делегата, который реализует этот метод, то ничего не происходит.