Существует третий вариант, который является общим шаблоном в наборах, который должен использовать @protocol
s.
Например:
@protocol QueryCompleteHandlerProtocol
- (void)queryType1Complete:(int)intStuff;
- (void)queryType2Complete:(float)floatStuff;
@end
То, что это делает, это объявляет набор вызовов методов, которым должен соответствовать объект, принимающий протокол (компилятор будет фактически обеспечивать это).
Таким образом, ваш объект SimpleQuery будет удерживать что-то вроде указателя делегата, который вы можете объявить следующим образом среди ivars:
NSObject<QueryCompleteHandlerProtocol> *callback;
То, что это говорит компилятору, это то, что callback
является объектом, который происходит от NSObject
и принимает протокол QueryCompleteHandlerProtocol
. Иногда вы видите это в виде:
id<QueryCompleteHandlerProtocol> callback;
Когда вы хотите вызвать обратный вызов, в них нет ничего особенного, методы SimpleQuery
просто вызовут:
[callback queryType1Complete:1];
[callback queryType2Complete:2.0];
Наконец, ваш клиент для класса procotol объявит себя принимающим протокол:
@interface MyClass : NSObject<QueryCompleteHandlerProtocol>
...
@end
И будет настроен как обратный вызов с некоторым кодом, например:
[lookup setCallback:self];
Здесь компилятор проверяет, что MyClass
соответствует QueryCompleteHandlerProtocol
, что означает, что он реализовал queryType1Complete:
и queryType2Complete:
.