Это называется неформальным протоколом, и именно так фреймворки Cocoa в основном объявляли методы делегата до последних версий Mac OS X.
Этот блок кода просто говорит о том, что он вызовет методы "WiiRemoteDiscovered:" и "WiiRemoteDiscoveryError:" для некоторого объекта. Название категории «WiiRemoteDiscoveryDelegate» указывает на то, что он планирует вызывать эти методы для делегата.
Представьте себе такой код:
@interface WiiRemoteDiscoverer {
id delegate;
}
@property id delegate;
- (void)startDiscovery;
@end
@implementation WiiRemoteDiscoverer
@synthesize delegate;
- (void)startDiscovery {
/* do the discovery ... */
[delegate WiiRemoteDiscoveryError:-1];
}
@end
Если бы вы это построили, вы бы получили предупреждение компилятора в строке, которая вызывает WiiRemoteDiscoveryError: потому что этот метод нигде не был объявлен. Чтобы избежать этого, вы можете сделать одну из двух вещей. Вы можете сделать то, что сделали авторы этого класса, и добавить это в шапку:
@interface NSObject( WiiRemoteDiscoveryDelegate )
- (void) WiiRemoteDiscovered:(WiiRemote*)wiimote;
- (void) WiiRemoteDiscoveryError:(int)code;
@end;
Этот блок в основном говорит, что каждый объект реализует WiiRemoteDiscovered: (что не соответствует действительности) и отключает предупреждение компилятора.
Или вы могли бы сделать что-то более формальное, как это:
@protocol WiiRemoteDiscovererDelegate <NSObject>
- (id)wiiRemoteDiscoveryError:(int)errorCode;
@end
@interface WiiRemoteDiscoverer {
id <WiiRemoteDiscovererDelegate> delegate;
}
@property id <WiiRemoteDiscovererDelegate> delegate;
- (void)startDiscovery;
@end
@implementation WiiRemoteDiscoverer
@synthesize delegate;
- (void)startDiscovery {
/* do the discovery ... */
[delegate wiiRemoteDiscoveryError:-1];
}
@end