什么是协议和委托,他们如何在IOS中使用?

我真的很困惑代表和议定书的概念。 它们是否等同于Java中的接口和适配器类? 他们如何工作? 到目前为止,我读过的资源都没有帮助。 “委托是一个简单而强大的模式,其中一个程序中的一个对象代表另一个对象或者与其他对象协同工作。委托对象保持对另一个对象的引用 – 委托 – 并在适当的时候发送消息对它“。 我不知道这是什么意思。 有人可以解释他们是什么,并举一个简单的例子? 提前致谢!

编辑:

据我了解,

1)委托实现协议(接口的另一个名称)

2)对象注册一个委托(实现一个协议)

3)对象可以调用委托的协议方法

因此,委托将对象与协议连接起来。

如果我错了,请纠正我。

我仍然不明白为什么对象本身不能实现一个协议? 它可以更容易!

协议是一种指定你希望类实现的一组方法,如果它想使用你的一个类。 代表和数据源像UITableViewDelegate和UITableViewDataSource确实是协议。

你这样指定一个协议:

@protocol MyProtocol <NSObject> - (void)aRequiredMethod; @required - (void)anotherRequiredMethod; @optional - (void)anOptionalMethod; @end 

在@required之后或在任何其他说明符之前声明的方法是需要的,并且希望使用您的协议的类需要实现所有这些方法。 您也可以通过在@optional说明​​符后面声明一些可选的方法来声明它们。

然后,您可以指定一个类在该类的接口中“符合”一个协议(实现所需的方法):

 @interface MyClass <MyProtocol> @end 

您通常使用属性保持对符合协议的对象的引用。 例如,要跟踪委托人:

 @property (nonatomic, weak) id<MyProtocol> delegate; 

在这一点上,在你的代码中,你只需要调用你想调用的对象的方法,就像你用任何其他方法一样实现你的协议。

 [self.delegate aRequiredMethod]; 

要检查对象是否符合您可以调用的协议

 [self.delegate conformsToProtocol:@protocol(MyProtocol)] 

要检查对象是否实现了可以调用的方法

 [self.delegate respondsToSelector:@selector(anOptionalMethod)] 

有关更多信息,请查阅Apple 使用协议指南。

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

 id<MyProtocol> instanceOfClassThatImplementsMyProtocol; 

如果您在代码中声明了这一点,那么任何“符合”协议MyProtocol的类都可以用在variablesinstanceOfClassThatImplementsMyProtocol 。 这意味着使用这个variables的代码知道它可以使用MyProtocol中定义的任何方法来使用这个特定的variables,而不pipe它是什么类。 这是避免inheritancedevise模式的好方法,避免了紧耦合。

代表是使用协议的语言function。 代理devise模式是devise代码以在必要时使用协议的一种方式。 在Cocoa框架中,委托devise模式用于指定符合特定协议的类的实例。 这个特定的协议指定了委托类应该实现的方法,以在给定的事件中执行特定的操作。 使用委托的类知道它的委托协议,所以它知道它可以在给定的时间调用实现的方法。 这种devise模式是解耦类的一个很好的方法,因为它使得交换一个委托实例变得非常容易 – 程序员所要做的就是确保replace实例或类符合必要的协议(即它实现了在协议中指定的方法)!

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

编辑:

请find这个例子。 在Cocoa Touch的UIKit framework中,有一个UITextFieldDelegate协议。 这个协议定义了一系列UITextField实例的委托类应该实现的方法。 换句话说,如果你想分配一个委托给UITextField (使用委托属性),你最好确保这个类符合UITextFieldDelegate 。 实际上,因为UITextField的委托属性被定义为:

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

然后,编译器会给出警告,如果你给它分配一个没有实现协议的类。 这真的很有用。 你必须声明一个类实现了一个协议,并且在说这个协议的时候,你让其他类知道他们可以和你的类以特定的方式进行交互。 因此,如果将MyTextFieldDelegateClass的实例分配给UITextField的委托属性,则UITextField知道它可以调用MyTextFieldDelegateClass某些特定方法(与文本input,select等有关)。 它知道这一点,因为MyTextFieldDelegateClass已经表示,它将实现UITextFieldDelegate协议。

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

最简单的forms是委托是从另一个对象接收消息的对象。 而且你一直这样做。

所以说你有一个引擎的汽车对象。

 @interface car : NSObject @property (nonatomic) id engine; @end 

所以可以将启动消息转发给引擎。

 [_engine start]; 

引擎是作为一个委托,你只是传递一个消息。

协议使其更加正式,Xcode将检查您是否符合所需的或可选的方法。

 @property (nonatomic) id <engineDelegate> engine; 

说引擎对象必须包含函数启动,因为在它要求的协议定义中。

 @protocol engineDelegate - (void) start; @optional - (double) fuelLevel; @end 

为什么代表和协议如此酷? 那么因为这个引擎可以是任何你可以在运行时使用的不同引擎,只要它符合协议,它可以是一个喷气引擎,一个内燃引擎,一个调相引擎。 而你告诉Xcode,它通过将委托添加到类接口来确保一致。

 @interface timeWarpDrive : NSObject <engineDelegate>