我使用这个类:
@interface NSObject( WiiRemoteDiscoveryDelegate )
- (void) WiiRemoteDiscovered:(WiiRemote*)wiimote;
- (void) WiiRemoteDiscoveryError:(int)code;
@end;
但我如何继承这个?
我使用这个类:
@interface NSObject( WiiRemoteDiscoveryDelegate )
- (void) WiiRemoteDiscovered:(WiiRemote*)wiimote;
- (void) WiiRemoteDiscoveryError:(int)code;
@end;
但我如何继承这个?
这被称为非正式协议,也是 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