【问题标题】:How do I discover which messages a delegate can / should implement?如何发现委托可以/应该实现哪些消息?
【发布时间】:2012-06-20 05:12:49
【问题描述】:

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

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

换个方式问这个问题,如果我为 NSApplication 创建了一个委托,我可以处理哪些消息?

NSApplication 的文档声明了一个委托

代表 NSApp 回复某些消息。

文档接着说

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

但据我所知,它没有列出这些方法/消息,所以我怎么知道我的委托会调用哪些方法/消息?

【问题讨论】:

    标签: objective-c cocoa delegates


    【解决方案1】:

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

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

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

    【讨论】:

    • 因此,如果类文档中有关委托的信息很少,我应该搜索 delegate E.G.如果我想知道窗口委托可以实现哪些消息,我会搜索 NSWindowDelegate?
    • @Benjamin:这是通常的命名约定。更直接的方法是检查 delegate 属性的类型,因为它通常与 id<FooDelegate> 类似(意思是“任何符合 FooDelegate 协议的对象”)。
    【解决方案2】:
    【解决方案3】:

    一个简短的说明是,了解正式协议和非正式协议之间的区别很有用。正式协议也有可选的方法,不需要调用。 当您编写自己的协议时,您需要检查 -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 文件中声明您的方法。

    【讨论】:

    • +1 获取额外信息,即使问题已经关闭。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多