如何发现代表可以/应该实现哪些消息?

时间:2011-05-15 21:18:21

标签: objective-c cocoa delegates

在Objective-C / Cocoa中,我如何发现我可以在委托类中实现的消息?

根据我在文档中读到的内容,一个类只允许通过委托处理某些选定的消息,但到目前为止很难找到一个类的消息列表。

以另一种方式提问,如果我为NSApplication创建了一个委托,哪些消息可供我处理?

NSApplication的文档声明了一个委托

  

代表NSApp回复某些消息。

文档接着说

  

NSApplication定义了20多个委托方法,这些方法提供了修改应用程序行为特定方面的机会。

但据我所知,它无法列出这些方法/消息,所以我怎么知道哪些方法将从我的代表处调用?

3 个答案:

答案 0 :(得分:2)

代表通常应该遵守为此目的而宣布的协议,例如NSApplicationDelegate。如果它没有明确说明,您通常可以通过查看delegate属性的类型(在本例中为id<NSApplicationDelegate>)找到相应协议的名称。您可以查看文档以获取有关方法的详细信息,或者在相应的头文件中查看@protocol声明,以了解哪些方法可用且哪些是必需的或可选的。

在某些情况下,对象没有为其委托定义协议,例如NSURLConnection。在这种情况下,您只需要遵循类的文档,了解它对委托的期望。

在任何一种情况下,当它向委托发送消息以及任何消息的语义是什么时,完全取决于类。

答案 1 :(得分:1)

答案 2 :(得分:1)

一个简单的说明是,了解正式和非正式协议之间的区别很有用。正式协议也有可选方法,无需调用。 当您编写自己的协议时,您需要在发送可选/非正式方法之前检查-respondsToSelector:

正式协议定义为......

@protocol SomeProtocol <NSObject>
-(void)someMethod:(id)sender;
-(void)someOtherMethod:(NSString*)aString;
@property(nonatomic,retain) someProperty;

@optional
-(BOOL)someOptionalMethod;

@end

并被采纳为......

@interface SomeClass : NSObject <SomeProtocol> {

}
@end

这告诉编译器您正在采用SomeProtocol,并且您不需要在.h文件中声明协议的方法,它还告诉编译器如果您没有实现所有必需的方法则警告您

对于非正式协议,您不要在语法上采用它们,但是您需要在.h文件中声明您的方法。