Как описано выше, делегат - это не функция iOS или Objective-C, а просто методика программирования и не требует специальной языковой поддержки.
Класс (e, g, classA) можно записать так, чтобы его методы getData и doSomething могли быть реализованы не самим собой, а делегатом (возможно, потому что classA не не знаю, какие будут данные или что для этого потребуется).
Для этого classA предоставляет свойство, обычно называемое делегат (которое является просто указателем на класс - делегат - который реализует делегированные методы), а затем, когда оно хочет вызвать те методы, он на самом деле вызывает методы в делегате:
[self.delegate getData];
и
[self.delegate doSomething];
self.delegate
может быть изначально установлен на self
:
self.delegate = self;
т.е.. classA реализует свою собственную версию этих методов, если они не делегированы.
Любой другой класс, желающий быть разработчиком методов (т. Е. Быть делегатом и, возможно, переопределять реализацию classA по умолчанию), сначала установит делегат classA в качестве самого себя. так что если бы classB хотел быть делегатом для этих методов, в classB мы бы получили:
classA.delegate = self;
Поэтому, когда classA вызывает эти делегированные методы, он фактически вызывает classB для реализации этих методов, не зная ничего о classB или даже о том, что он существует, и classB не должен подкласс classA.
Ограничение состоит в том, что classB может переопределять только те методы, которые classA хочет делегировать - с помощью подклассов можно переопределить любой метод.
Протоколы используются для формализации процесса делегирования путем определения списка методов, которые делегат должен реализовать либо * (делегатор не предоставляет версию метода и метода по умолчанию). должен быть реализован где-то) или может быть дополнительно реализован делегатом (т. е. делегат имеет свою собственную версию или не имеет значения, если метод не реализован).