协议和代表之间的区别?

时间:2011-03-25 10:48:42

标签: iphone objective-c delegates protocols

protocoldelegate之间的区别是什么?

我们如何在variables中声明protocol class

7 个答案:

答案 0 :(得分:76)

使用Objective-C中的(@protocol语法)声明的协议用于声明一组类“采用”(声明它将使用此协议)将实现的方法。这意味着您可以在代码中指定“只要它实现特定协议,您就不关心使用哪个类”。这可以在Objective-C中完成,如下所示:

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

如果您在代码中说明了这一点,那么“符合”协议 MyProtocol 的任何类都可以在变量 instanceOfClassThatImplementsMyProtocol 中使用。这意味着使用此变量的代码知道它可以使用 MyProtocol 中使用此特定变量定义的任何方法,而不管它是什么类。这是避免继承设计模式的好方法,避免了紧耦合。

代表使用协议的语言功能。 delegation design pattern是一种设计代码以在必要时使用协议的方法。在Cocoa框架中,委托设计模式用于指定符合特定协议的类的实例。此特定协议指定委托类应在给定事件中执行特定操作的方法。使用委托的类知道它的委托符合协议,因此它知道它可以在给定时间调用已实现的方法。这种设计模式是解耦类的好方法,因为它使得将一个委托实例交换为另一个委托实例变得非常容易 - 程序员必须做的就是确保替换实例或类符合必要的协议(即它实现了协议中规定的方法)!

协议和委托不仅限于Objective-C和Mac / iOS开发,而且Objective-C语言和Apple框架大量使用这种令人敬畏的语言特性和设计模式。

修改

这是一个例子。在Cocoa Touch的UIKit框架中,有一个 UITextFieldDelegate 协议。该协议定义了一系列方法,这些方法是 UITextField 实例的委托应该实现的。换句话说,如果要将委托分配给 UITextField (使用delegate属性),则最好确保此类符合 UITextFieldDelegate 。实际上,因为 UITextField 的委托属性定义为:

@property(nonatomic, weak) id<UITextFieldDelegate> delegate

然后,如果为其分配一个未实现协议的类,编译器将发出警告。这非常有用。你必须声明一个类实现了一个协议,并且说它确实存在,你让其他类知道它们可以以特定的方式与你的类进行交互。因此,如果将 MyTextFieldDelegateClass 的实例分配给 UITextField delegate属性,则 UITextField 知道它可以调用 MyTextFieldDelegateClass 的某些特定方法(与文本输入,选择等相关)。它知道这一点,因为 MyTextFieldDelegateClass 表示它将实现 UITextFieldDelegate 协议。

最终,这一切都会为您的项目代码带来更大的灵活性和适应性,我相信您在使用这项技术后很快就会意识到这一点! :)

答案 1 :(得分:23)

协议是一组方法(可选的或必需的),这些方法将由符合该协议的类实现。虽然,delegate是对该类的引用,它符合该协议,并将遵守协议中定义的方法。

请查看this了解更多详情。

答案 2 :(得分:13)

代表团:代表另一个对象(oops中的设计模式)

这是一个设计模式,其中一个名为委托的对象代表另一个对象并在另一个对象的请求下行动。在执行的某个时刻,它向其委托发送一条消息;消息告诉委托一些事件即将发生并请求一些响应。委托实现消息调用的方法并返回一个适当的值

一个例子是appdelegate对象代表appobject。

协议:启用与继承无关的对象之间的通信

协议是程序接口的声明,其任何类都可以实现。方案是客观的c 语言特性。简单说一下任何类都可以实现的方法列表。要使用它你需要确认协议。 示例是UITableviewDatasource协议,其方法cellforRowAtIndexPath在协议中声明,但我们实现它以创建tableview。

参考https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/StreamlineYourAppswithDesignPatterns/StreamlineYourApps/StreamlineYourApps.html

答案 3 :(得分:6)

i 重要 p 的重要条件是了解协议 f irst 然后委托。我建议您先查看this简短教程,然后查看What is a Protocol?。此外,您必须知道类和协议之间的区别,因此请参阅Objective-C: Class versus ProtocolWhat is the point of Protocols?

protocol: 只是实施功能的蓝图。任何采用该蓝图的班级都必须实施这些功能。 (不要误以为实现一个函数调用一个函数)

delegate: 1 也适合执行一个委托 - ing 类是什么没有 继承,例如

例如,你有一个viewController并且想要下载图像,或者你想让顾客与商店保持距离,所以你不必自己做这件事,而是只有一个中等对象为你做。该对象称为委托对象。通常你会这样做:

class ViewController : UIViewController , DownloaderDelegate{
//other code

// inside viewDidLoad or elsewhere you write:
downloaderHandler.delegate = self // now self can also use whatever the delegating object gives it...previously it was only a viewController but now it's 'almost' also a downloader

非常类似于您遵守tableViewDelegate

所做的事情
class ViewController : UIViewController , UITableViewDelegate{
//other code

// inside viewDidLoad or elsewhere you write
tableView.delegate = self 

您的self现在也可以执行与tableView相关的内容。

<强> delegate: 2 但是该对象(委托)是一个简单的vanilla对象(id或Any)。这是愚蠢的!您必须告诉它:&#34;嘿,您需要具备符合我们为您定义的协议所需的特定功能。 (我们不会将Any或id扩展为愚蠢的,(相反)我们制定了一个非常明确的限制协议&#34;
在Objective-C中,它是一个纯粹的香草id,所以你做

 @property (weak) id<DownloaderProtocol>delegate;  

在Swift * 中,你做得稍微容易一些:

weak var delegate:DownloaderProtocol?

协议来解救......委托实现(不使用)函数,但它适合你的委托类的需要。

*:在Swift中,您还没有id仍然不需要等效的Any因为在Swift协议中也是一流的公民类型

答案 4 :(得分:4)

让我们看一下程序中的委托声明

 id<myProtocol> *delegatingObject;

delegatingObject保留对另一个对象的引用,并在适当的时候向该对象发送消息。

协议是一组可由任何类实现的相关属性和方法。

这意味着确认myProtocol(相关属性和方法组)的任何对象(id类型)都可以作为委托工作,或者你可以说任何具有所需学位(协议)的人(id)都可以作为教师工作(代表)。

答案 5 :(得分:1)

我们可以说协议作为一组规则。 该规则可以是可选的,也可以是必需的,就像我们必须在协议中使用的一样。

代表是目标C和迅捷的消息传递技术。一个对象必须处理该消息。

示例::每个iOS开发人员惯用的简单示例是UITableview。 创建表时,您必须在控制器中实现cellForRowAtIndexPath()numberOfRowsInSection(),根据需要在UItableview类中定义规则(协议),这是协议的要求。

还有其他协议,例如heightForRowAtIndexPath()是可选的。

现在在UITableView中进入 Delegate (委托),有一个方法(消息)didSelectRowAtIndexPath()向您发送事件消息。如果将委托设置为self,则意味着您的控制器是准备照顾那个事件。

对于开发人员来说,这个术语似乎更令人困惑,因为我们习惯于将它们一起使用(:

享受!!!!

答案 6 :(得分:0)

代表和协议属于以下概念 (一对一)通信模式b / w viewControllers或类。

这意味着一个类或viewController正在与另一类或 viewController(指向记住一对一通信的点)。m

第一个类或viewController提供(委托)它对第二个的引用
通过确认第二类的协议来与之对话。

使用1级参考,2级代表1级进行工作 类,因此将信息提供给第一类。

请使用以下链接观看概念的实现: https://www.youtube.com/watch?v=DBWu6TnhLeY

形式上的解释是-协议是一组方法(可选或 (必填),由(1st)类实施,以确认 协议。而委托是对该(1st)类的引用,该类确认了
遵守该协议,并将坚持执行协议中定义的方法。