Objective-C代理与Java监听器

19

我阅读了大量关于Objective-C delegate的文章和资料,试图理解它们。作为来自Java的开发者,它们看起来非常像Java监听器。例如,假设我有一个Java中的按钮。当按下这个按钮时,我希望发生某些事情。我的代码可能类似于:

ButtonListener myButtonListener = new ButtonListener();    
someButton.addActionListener(myButtonListener);
...

class ButtonListener implements ActionListener
{
   public void actionPerformed(ActionEvent e)
   {

    }
}

类似这样。 在Objective-C中,我似乎需要调用一个setDelegate方法给我的按钮并将“监听器”作为代理传递给它。实际的按钮类可能会检查该委托是否响应某些选择器(即actionPerformed)。如果我正确地思考这个问题,似乎委托就像监听器一样。那是正确的吗?有什么主要区别吗?

谢谢!

4个回答

10

你的理解基本正确。唯一的区别是,在 Objective-C 中,代理通常会实现多个函数,以执行有关所代表对象的事件的各种操作。例如,UITextViewDelegate 具有以下方法:

textViewShouldBeginEditing:textViewDidBeginEditing:textViewShouldEndEditing:textViewDidEndEditing:

我发现唯一真正的区别是你不能像Java那样内联创建委托:

someButton.setOnClickListener ( new View.OnClickListener {
    @Override
    public void onClick() {
        //do stuff
    }
});

4
技术上,使用代码块,你可以创建行内委托。我有一个这方面的实用类存储在我的硬盘中…… - Richard J. Ross III
哦真的吗,我在一个应用程序中正在寻找这样的东西,以免不得不为一个委托函数创建一个全新的类。我很想看看你是如何做到这一点的。 - Dan F
1
这里是代码相关的内容:Header: http://pastebin.com/Gdg4nsAF Main: http://pastebin.com/SGVGCB31。你需要为每个委托创建一个类,但当你需要很多时,这有助于减少类的数量。 - Richard J. Ross III
你有使用它的示例吗?我不确定我理解代码。 - Dan F
Swift的代理和Java的监听器是否相同? - Micro

8
他们是相似的,但并不完全相同。委托模式具有更广泛的定义,通常包括实现定义的任务,这些任务可以超出仅监听的范围。这些任务可能包括监听,或者代表的实现可能被定义为(专门)监听。
Objective-C 委托通常用于避免子类化,并用作侦听器或数据提供者。委托所做的事情由协议定义 - 它可以作为远不止监听器的东西。因此,委托可以是数据源/提供者。它只是将实现卸载到另一个类中的一种手段,以移除经常定制的特定于应用程序的实现。
NSButton/UIButton已通过目标+操作机制进行了特殊化处理。对于这种特定情况,您将使用目标+操作。

1

Delegate(委托)与Listener(监听器)或Observer(观察者)类似,Protocol(协议)与Interface(接口)类似,但Protocol可以定义可选函数(也称为消息)。在Objective C中,您可以使用Category来增强现有类(没有源代码),以采用Protocol并将其作为Delegate,这样您就不需要创建新的匿名内部类。在Java中无法实现此功能。


0

我认为,与.NET委托更好的Java类比可以在java.util.concurrent包中找到:Callable、Future、Executor。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接