Делегаты - это шаблон проектирования на объектно-ориентированных языках, который позволяет объекту «вызывать» неизвестный код для выполнения действий или вычислений, которые этот объект не может эффективно выполнить самостоятельно. Допустим, у вас есть класс Dog:
@protocol DogDelegate;
@interface Dog : Wolf <Domesticated>
- (void)bark;
- (void)tiltHeadAdorably;
- (void)playWithToy: (Toy *)aToy;
@property (readonly) Toy *favoriteChewToy;
@property (readwrite, assign) id <DogDelegate> delegate; // "DELEGATE" PROPERTY DECLARED HERE
@end
Объект делегата обычно предоставляется кодом, который создает экземпляр Dog
, и вызывается этим экземпляром для выполнения действий, которые сама собака не может делать. Например, рассмотрим этот интерфейс протокола DogDelegate
, который определяет, что ожидается от объекта делегата Dog
:
@protocol DogDelegate <NSObject>
@required - (void)letDogOut: (Dog *)aDog;
@required - (void)letDogIn: (Dog *)aDog;
@optional - (void)scratchDog: (Dog *)aDog forTimeInterval: (NSTimeInterval)duration;
@end
В этом случае экземпляр DogDelegate
часто является владельцем Dog
(а в Objective-C делегат часто владеет объектом, поэтому это хорошо согласуется с метафорой.) Собака, когда ему нужно пойти на ... собачью деятельность ... попросит своего делегата выполнить метод -letDogOut:
, поместив собаку на заднем дворе. Когда это будет сделано, он попросит своего делегата выполнить метод -letDogIn:
, возвращая собаку обратно внутрь. Когда собака хочет привязанности, если ее делегат может это сделать, она просит делегата поцарапать ее в течение некоторого периода времени, используя -scratchDog:forTimeInterval:
.