在Objective-C / Cocoa中,我如何发现我可以在委托类中实现的消息?
根据我在文档中读到的内容,一个类只允许通过委托处理某些选定的消息,但到目前为止很难找到一个类的消息列表。
以另一种方式提问,如果我为NSApplication创建了一个委托,哪些消息可供我处理?
NSApplication的文档声明了一个委托
代表NSApp回复某些消息。
文档接着说
NSApplication定义了20多个委托方法,这些方法提供了修改应用程序行为特定方面的机会。
但据我所知,它无法列出这些方法/消息,所以我怎么知道哪些方法将从我的代表处调用?
答案 0 :(得分:2)
代表通常应该遵守为此目的而宣布的协议,例如NSApplicationDelegate。如果它没有明确说明,您通常可以通过查看delegate
属性的类型(在本例中为id<NSApplicationDelegate>
)找到相应协议的名称。您可以查看文档以获取有关方法的详细信息,或者在相应的头文件中查看@protocol声明,以了解哪些方法可用且哪些是必需的或可选的。
在某些情况下,对象没有为其委托定义协议,例如NSURLConnection。在这种情况下,您只需要遵循类的文档,了解它对委托的期望。
在任何一种情况下,当它向委托发送消息以及任何消息的语义是什么时,完全取决于类。
答案 1 :(得分:1)
NSApplicationDelegate
文档中描述了这些方法:
答案 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文件中声明您的方法。