Objective-C delegates 与Java监听器

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我已经阅读了大量有关Objective-C代表的文章和阅读材料,试图理解它们。来自Java,他们看起来非常像Java听众。例如,假设我在Java中有一个按钮。当按下按钮时,我想要发生一些事情。我的代码可能看起来像这样:

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

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

    }
}

类似的东西。在objective-c中,我似乎会按照为我的按钮调用setDelegate方法并将其作为委托传递给“侦听器”的方式来执行某些操作。然后,实际的按钮类可能会检查该委托是否响应某个选择器(即actionPerformed)。如果我以正确的方式思考这个问题,那么代表就像听众一样。那是对的吗?有什么重大分歧吗?

谢谢!

提问于
用户回答回答于

你几乎在那里的按钮。唯一真正的区别是obj-c中的委托通常实现多个函数,以便对与它们委派的对象有关的事件执行各种操作。例如,UITextViewDelegate具有以下方法:

– textViewShouldBeginEditing:
– textViewDidBeginEditing:
– textViewShouldEndEditing:
– textViewDidEndEditing:

我发现的唯一真正的区别是你不能创建你的委托内联,你可以像在java中的方式:

someButton.setOnClickListener ( new View.OnClickListener {
    @Override
    public void onClick() {
        //do stuff
    }
});
用户回答回答于

它们是相似的,但不完全相同。委托模式具有更广泛的定义,并且通常实施定义的任务可以超出单独收听。任务可以包括监听,或者委托的实现可以被定义为监听(专有)。

objc委托通常用于避免子类化,并用作侦听器或数据提供者。委托人所做的事情是由协议定义的 - 它不仅仅是一个听众。所以代表可以是数据源/提供者。它只是一种将实现卸载到另一个类的方法,从类中删除经常定制的应用程序特定实现。

NSButton / UIButton已经通过目标+动作机制专门用于这种情况。你会使用target + action来处理这个特定的情况。

扫码关注云+社区