1

通常,Xcode 中的自动完成功能会自动完成该类的方法名称,如果该类位于其他对象的委托中,则方法名称如下:

@interface ViewController : UIViewController <UIAlertViewDelegate, 
                                              GKPeerPickerControllerDelegate>

但是对于 Game Kit 的方法,要在里面ViewController.m

- (void) receiveData:(NSData *)data fromPeer:(NSString *)peer 
           inSession: (GKSession *)session context:(void *)context {
     // ...
}

它似乎不是任何委托方法的一部分,无论是通过 Xcode 的自动完成还是在任何文档中?如果它不是委托的一部分,为什么它与所有其他委托方法的工作方式不同?


更新:如果我搜索所有头文件:

grep -r receiveData /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk

包含该行的唯一文件是:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/GameKit.framework/Headers/GKSession.h:- (void)setDataReceiveHandler:(id)handler withContext:(void *)context; // SEL = -receiveData:fromPeer:inSession:context:

所以它只出现在评论中......

4

2 回答 2

3

setDataReceiveHandler:withContext:类中方法的文档GKSession说:

处理程序必须实现具有以下签名的方法:

- (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context;

这并不能回答您为什么没有像普通委托方法那样实现此方法的问题。我认为这种实现提供了更大的灵活性,因为您可以让一个对象响应GKSession管理连接的委托方法,同时指定一个不同的对象在建立连接后处理传入的数据。

无论如何,希望这能回答这个方法在哪里定义的实际问题,这让我摸不着头脑。

于 2012-10-19T17:37:11.430 回答
0

我怀疑它是不同的,因为 API 可以追溯到 Objective C 的早期版本(最初,协议不是强类型的,并且大多数回调方法都是以这种临时的、非编译器检查的方式定义的)。

大多数(几乎所有)核心 API 都已更新,因此所有协议都是显式的,所有回调都是键入的——我猜他们错过了这个。

于 2013-05-23T16:15:11.610 回答