0

我使用这个类:


@interface NSObject( WiiRemoteDiscoveryDelegate )

- (void) WiiRemoteDiscovered:(WiiRemote*)wiimote;
- (void) WiiRemoteDiscoveryError:(int)code;

@end;

但我如何继承这个?

4

1 回答 1

0

这被称为非正式协议,也是 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
于 2011-04-09T05:22:42.117 回答