delegate和protocol

协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的。网上的很多博文只是讲了怎么使用,并没有说的很明白。下面我谈一下我的理解。

1.你要先搞明白,协议和代理为什么会出现,也就是说它存在的意义是什么,解决了什么问题。

协议和代理是模块化开发和封装的产物。
先讲一个小故事帮助大家理解:

老王有一家餐馆,刚刚开始的时候规模很小,所以老王一个人做了所有的事情:扫地,做菜,迎宾,上菜,收银。但是后面随着规模的扩大,老王一个人就吃不消了,忙死也忙不过来了。这时候怎么办?大家都很清楚吧,招人呗!所以后面就有了服务员,收银员,大厨,保洁员。
这就意味着原先老王的工作按模块进行了拆分。

餐馆的工作流程(业务逻辑)简单来说是这样的:点餐->做菜->上菜->收银->打扫卫生。

转换成编程世界的模型就是这样的:业务不是很复杂的时候,我们把所有的功能都写在一个类里面,这个类暂且叫老王,理论上所有的事情和功能都可以写到这个类里面。做菜方法,上菜方法,打扫方法......就造成了老王这个类非常的庞大和臃肿,并且容易出错。

那我们开始招人了,新建了大厨类,服务员类,收银类,保洁类,这四个类。大厨类有做菜方法,服务员类点菜,上菜方法,收银类有收银方法,保洁类有打扫方法。

仅仅这样还是不行的,因为模块开发必然就有模块分化以后模块之间的通信问题。大厨类只做菜 但是菜做好了怎么办,必须及时的上菜,让顾客享用。但是大厨自己不能上菜,所以大厨必须抛出菜做好了的信号,具体这个菜上不上,怎么上,就不是大厨关心的了。

2.协议和代理所发挥的作用

老王交代大厨,你只管做菜,菜做好了以后喊一声菜做好了(我见过一个餐馆是拉铃铛)。
那么老王跟大厨定的这个规矩就是协议(protocol),下面看代码:

DaChu.h

/**
 *  下面是声明协议的固定格式,DaChuDelegate是协议的名称,因为是代理协议,名称格式为:类名+Delegate
 */
@protocol DaChuDelegate <NSObject>
- (void)doSomethingAftercaiZuohaole;
@end

@interface DaChu : NSObject
/**
 *  delegate 是dachu类的一个属性,weak 关键字是为了避免循环引用,<DaChuDelegate>表示遵守DaChuDelegate协议
 *  更加直白点:在大厨心里有一个人接受他的菜好了的信号去做一些事情,具体这个人是谁,大厨不关心,这个人的代号是delegate
 */
@property (nonatomic, weak) id <DaChuDelegate> delegate;
- (void)kaiShiZuoCai;
@end
Dachu.m
#import "DaChu.h"

@implementation DaChu
- (void)kaiShiZuoCai{
    NSLog(@"开始做菜");
    sleep(2);
    NSLog(@"做好菜了,该上菜了");

   //下面这句是判断 一下delegate是否实现了doSomethingAftercaiZuohaole方法,如果delegate没有实现
    //直接[self.delegate doSomethingAftercaiZuohaole];会crash
    if ([self.delegate respondsToSelector:@selector(doSomethingAftercaiZuohaole)]) {
        [self.delegate doSomethingAftercaiZuohaole];
    }

}
@end

下面看一看laowang这个类里面的内容

#import "LaoWang.h"
#import "DaChu.h"

@interface LaoWang ()<DaChuDelegate>//<DaChuDelegate>表示遵守DaChuDelegate协议,并且实现协议里面的方法

@end

@implementation LaoWang
- (void)laoWangKaiYe{
    NSLog(@"老王开业了");

    DaChu *dachu1 = [[DaChu alloc] init];
    dachu1.delegate = self;//说明老王充当代理的角色,负责接收菜好了的信号。
    [dachu1 kaiShiZuoCai];//大厨开始做菜
}
- (void)doSomethingAftercaiZuohaole{
    NSLog(@"老王知道了");//这里可以通知服务员去上菜了
}
@end

上面的这个过程,也可以看下图来理解:

关于协议的理解,大家还可以参考这篇博文。

时间: 2024-12-05 20:09:06

delegate和protocol的相关文章

转iOS中delegate、protocol的关系

iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolcategoryobject-c 刚开始接触iOS,对delegate.protocol这两个概念比较模糊.参考了一些资料,记录下来体会. 1.protocol protocol和interface的概念类似,是object-c语法的一部分.protocol就是一系列不属于任何类的方法的列表.其中声明

delegate或者protocol申请属性的时候为什么用assign而不是retain

首先delegate要使用assign而不是retain,这个问题大家通过看iOS的api就可以了,最典型的是tabView里面的delegate和datasource都是用的assign. 那为什么要使用assign而不是retain呢? 首先,考虑类的设计模式,类与类只见的大体关系有继承和聚合的关系,当我们使用聚合的时候该对象就拥有聚合的对象,这时候我们就需要retain使引用计数器+1来控制该对象的内存管理,所以我的感觉retain和copy的一项能力就是拥有该对象的内存管理权. 下面就得

代理设计模式规范delegate和protocol

充当代理的步骤: 首先要明确谁请别人代理,谁当别人的代理 1> 请代理三部曲: 1 写一个协议protoc,把自己不方便做的事列出来(@protocol  studentDelegate <NSObject>) 2 包含一个遵守协议的对象,对象可以是任意类型 id<studentDelegate>delegate; 3 当发生一些事情想通知代理去做,就是调用代理对应的方法 [self.delegate studentDidReceiveKuaiDi:self]; 2>

category、protocol、delegate总结

一.category(类别) 类别是一种类扩展的机制,能为现有的类添加新方法. ①类别的基本语法 @interface部分,如: @interface NSString (NumberConvenience) - (NSNumber *) lengthAsNumber; @end 我们为NSString类添加了名为NumberConvenience的类别. 注: 类别只可以添加方法,不可以添加实例变量 类别可以添加属性,但属性必须是@dynamic类型的  @implementation部分 @

Protocol(协议)、Delegate(委托)、DataSource(数据源)

这里以 UITableViewController 和 UITableView 的关系为例: //------------------------------------------------------------------------ // UITableViewController.h @interface UITableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> @pr

Protocol协议及委托代理(Delegate)传值

前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替.Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法.也就是说,它只告诉你要做什么,但具体怎么做,它不关心. 当一个类要使用某一个Protocol(协议)时,都必须要遵守协议.比如有些必要实现的方法,你没有去实现,那么编译器就会报警告,来提醒你没有遵守××协议.注意,我这里说的是警告,而不是错误.对的,就算你不实现那些“必要实现”的方法,程序也是能运行的,只不过多了些警告. 我会在本

iOS delegate 实现页面之间的传值

最近刚刚接触ios开发,也没有一本好的书可以阅读,所有的功能都只能靠自己的摸索实现.这两天在做多个页面之间的跳转和传值问题, 页面跳转看我另一篇文章http://blog.csdn.net/xiaotanyu13/article/details/7711954 现在将用delegate来传值 一开始看网上的资源有些看不懂,总感觉很高深的样子 后来一想,实际上delegate传值的实质就是: 比如右AB两个页面,A想要传值给B ,就只要先在A中得到B的指针,然后将想要传的值赋给B,之后跳转, 话不

Delegate,Block,Notification, KVC,KVO,Target-Action

Target-Action: 目标-动作机制,所有的UIControl及子类都是这个机制:原理:在对象产生某个事件的特定时刻,给一个对象发送一个消息:类内部target去执行action方法 Delegate:  iOS2.0以后出现,delegate配合protocol,delegate 是一对一的关系,修饰符使用weak, 当 Block: iOS4.0以后出现,一对一 Notification: 一对多, KVC: 键值编码,即是指 NSKeyValueCoding,一个非正式的Proto

protocol的简单写法

1 // 2 // TouchView.h 3 // LessonUIControlAndSubClass 4 5 6 7 #import <UIKit/UIKit.h> 8 9 @class TouchView; 10 //1.制定协议,协议名字格式:类名+Delegate 11 @protocol TouchViewDelegate <NSObject> 12 13 @optional 14 - (void)touchBegan:(TouchView *)touchView;