写一些关于委托和协议的demo给大家参考。委托和协议最大的用处就是,比如我是老板,我有那么多项目,可是 我没有去实现他,我需要委托我手下的程序员去完成那些代码。同事呢,程序员,也可以把他需要反馈的信息提交给老板,或者让老板也帮程序员做事情,两个人之间是可以相互利用的。这就是委托加协议的精髓吧,就其本质而言,我觉得委托是一个C语言里面指向指针的指针函数的概念。而协议呢,是一个抽象起来的概念。
例子:http://www.kuaipan.cn/file/id_27084742373409805.htm 访问密码:
协议声明编程接口,任何类都可选择实现此编程接口。通过协议,两个在继承上没有关联的类可以互相通讯,协作实现某种目标。从这个角度来说,协议为子类化提供了替代选择。如果一个类提供某种服务,则它可以声明一个编程接口,以此来对外提供匿名服务。其他希望使用服务类需要采纳该协议,并实现协议的一个或者多个方法。声明协议类将会调用协议采纳者实现的方法(协议中的方法)。
![Protocol](http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Art/protocol.jpg)
正式和非正式协议
协议有两种类型—正式协议和非正式协议:
-
非正式协议是
NSObject
类的范畴类(范畴类是语言特征。通过它,您无需子类化就向某个类增加方法),这意味着几乎所有的对象都是非正式协议的采纳者。非正式协议中的方法不必全部实现。在调用某个方法之前,调用对象会先检查目标对象是否实现此方法。在可选协议方法被引入Objective-C 2.0之前,非正式协议实质上是Foundation和AppKit 类用于实现委托的方式。 -
正式协议声明一个方法列表,协议采纳者需要实现表中所有方法。正式协议有特殊的声明、采纳以及类型检查语法。您可以使用
@required
和@optional
关键字指定方法必须实现或可选实现。子类将会继承其祖先类所采用的正式协议。一个正式协议也可以采纳其他的协议。正式协议是对Objective-C语言的扩展。
采纳和遵循正式协议
一个类可以声明自己采纳的正式协议,也可以从超类继承。我们在类的@interface
声明中使用尖括号来表示采纳协议。在下面的例子中,CAAnimation
声明自己的超类是NSObject
,并且正式采纳三种协议。
如果一个类采纳某个协议或者这个类的祖先类采纳某个协议,我们说这个类—以及该类的任意实例—遵循某个协议。遵循某个协议也意味着这个类将实现协议中所有必须实现的方法。通过在运行时向对象发送conformsToProtocol:
消息可以判断它是否遵循某个协议。
委托是一种简单而强大的模式。在此模式中,程序中的一个对象代表另外一个对象执行某个动作,或者与之相互协作共同完成某个任务。发布委托的对象持有其他对象(委托)的引用。在适当的时候,它会向委托发送消息。消息用于通知委托对象发布委托的对象将要处理或者已经处理某个事件。作为响应,委托对象会更新外观或者更新自身或应用程序其他对象的状态。在某些情况下,委托对象也可以返回一个值,通过它来影响事件(即将被处理的事件)的处理方式。通过委托,我们可以以某个对象为中心,轻松定制周围的数个对象。
委托和Cocoa框架
通常情况下,发布委托的是框架对象,委托是定制的控制器对象 。发布委托对象持有委托的弱引用。Foundation、UIKit、AppKit以及其他的Cocoa及Cocoa Touch框架有很多地方使用委托。
在AppKit 框架中,NSWindow
类的实例是一个发布委托的对象。 NSWindow
声明一个协议,windowShouldClose:
是协议的一个方法。当用户点击某个窗口关闭框时,窗口对象向委托发送windowShouldClose:
消息,要求它确认窗口是否关闭。委托则返回一个Boolean类型值,通过该值控制窗口对象的行为。
![Framework object sending a message to its delegate](http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Art/delegation.jpg)
委托和通知
大部分Cocoa框架类的委托都自动注册为发布委托对象所发通知的观察者 。委托只需实现框架类声明的某个通知方法,以此接收特定的通知。仍以上述例子进行说明,窗口对象向观察者发送NSWindowWillCloseNotification
消息,但是向委托发送 windowShouldClose:
消息。
数据源
数据源几乎等同于委托,不同之处在于它同发布委托对象的关系。发布委托对象并不把对于用户界面的控制转交给它,而是把数据控制交给它。发布委托对象,通常是诸如表视图这样的视图对象。它持有数据源引用,并时不时向其索要待显示数据。数据源和委托一样,也必须遵循某种协议并至少实现协议所要求的方法。数据源负责管理模型对象的内存,并将其提供给发布委托的视图。
协议声明编程接口,任何类都可选择实现此编程接口。通过协议,两个在继承上没有关联的类可以互相通讯,协作实现某种目标。从这个角度来说,协议为子类化提供了替代选择。如果一个类提供某种服务,则它可以声明一个编程接口,以此来对外提供匿名服务。其他希望使用服务类需要采纳该协议,并实现协议的一个或者多个方法。声明协议类将会调用协议采纳者实现的方法(协议中的方法)。
![Protocol](http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Art/protocol.jpg)
正式和非正式协议
协议有两种类型—正式协议和非正式协议:
-
非正式协议是
NSObject
类的范畴类(范畴类是语言特征。通过它,您无需子类化就向某个类增加方法),这意味着几乎所有的对象都是非正式协议的采纳者。非正式协议中的方法不必全部实现。在调用某个方法之前,调用对象会先检查目标对象是否实现此方法。在可选协议方法被引入Objective-C 2.0之前,非正式协议实质上是Foundation和AppKit 类用于实现委托的方式。 -
正式协议声明一个方法列表,协议采纳者需要实现表中所有方法。正式协议有特殊的声明、采纳以及类型检查语法。您可以使用
@required
和@optional
关键字指定方法必须实现或可选实现。子类将会继承其祖先类所采用的正式协议。一个正式协议也可以采纳其他的协议。正式协议是对Objective-C语言的扩展。
采纳和遵循正式协议
一个类可以声明自己采纳的正式协议,也可以从超类继承。我们在类的@interface
声明中使用尖括号来表示采纳协议。在下面的例子中,CAAnimation
声明自己的超类是NSObject
,并且正式采纳三种协议。
如果一个类采纳某个协议或者这个类的祖先类采纳某个协议,我们说这个类—以及该类的任意实例—遵循某个协议。遵循某个协议也意味着这个类将实现协议中所有必须实现的方法。通过在运行时向对象发送conformsToProtocol:
消息可以判断它是否遵循某个协议。