文档章节

iOS中 委托 代理 协议 的理解

 动态灵犀
发布于 2015/10/20 16:15
字数 885
阅读 675
收藏 5

1、协议:协议不是类,是一种约定,他声明的方法和属性,都是独立于其他任何特定的类,并本身不会去实现他,让使用他的类去实现他,比如UITableView,需要实现他的cellForRowAtIndexPath等协议,谁用谁知道。

协议的两个预编译指令@optional:可以选择的方法。@required:必须执行的方法。

我们打开UITableView的头文件,看下他的声明:

@protocol UITableViewDataSource<NSObject>

@required

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

可以看到,这些方法是协议要求你必须实现的。

现在来看看写周报的事,

我们新建一个类,Work

在Work.h头部申明要写周报(协议)

Work.h:

#import <Foundation/Foundation.h>
@protocol Weekly <NSObject>;
@required
-(NSString *)Progress;
@optional
-(NSString *)Advice;
@end
@interface Work : NSObject

@end

Weekly协议里面有个方法,就是Progress"进度",而且是@required的强制要求实现的

还有一个方法 Advice "建议",是@optional可实现可不实现

注意一点,<NSObject>是遵循NSObject协议,不是NSObject类

2、委托

假设主管是A类

A.h里面:

#import "Work.h"
@interface A : NSObject
//定义一个委托代理
@property (nonatomic) id <Weekly> delegate;
@end

@property (nonatomic) id <Weekly> delegate;

就像主管开会,宣布了一个任务 :delegate,这个任务就是要写周报 :<Weekly>

接下来分配

员工B类、C类、D类等,我就指写一个B类做例子

A.m里面:

#import "A.h"
//导入B
#import "B.h"
@implementation A
-(instancetype)init{
    self = [super init];
    //实例化员工B
    B* b = [[B alloc] init];
    //设置代理的实现者是B员工对象,等于分配任务给他
    self.delegate = b;
    //主管查看B员工的周报
    NSString* B_Progress = [b Progress];
    NSString* B_Advice = [b Advice];
    NSLog("%@",B_Progress);
    NSLog("%@",B_Advice);
    return self;
}

我们会发现self.delegate = b; 会有警告,为什么呢?因为B员工现在还只是员工B,不是已经投入写周报的B员工,因为他还没接受你这个任务,是不是?我做不做那是我的事,你交代给我我不做,那你就麻烦了,我可以不写,大不了不干是吧?跟上级有冲突的屌丝就是这样,各种理由各种反驳,如果B接受任务,就要受写周报约束,来看下

B.h里面:

//导入协议类
#import "Work.h"
//<Weekly>遵循周记的协议,必须写周记
@interface B : NSObject <Weekly>

@end

B.m里面实现:

//周记必须写的内容
-(NSString *)Progress{
    return @"xxx项目进度达到90%!";
}
//可写可不写的内容
-(NSString *)Advice{
    return @"主管英明神武,没有意见!";
}

这样,B类就实现了协议的内容,完成了主管分配的任务,并返回结果。如果不实现Progress,xcode会报警告,你没有实现这个代理。



总结:

一、协议的定义
@protocol 协议名 <NSObject>;
@required
必须实现的方法
@optional
可选实现的方法
@end
二、委托的定义
@pro



© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 13
码字总数 2299
作品 0
深圳
私信 提问
UIView Animations 学习笔记(二)定制动画效果及切换效果

目录 UIView Animations 学习笔记(一)简介及API说明 UIView Animations 学习笔记(二)定制动画效果及切换效果 UIView Animation 学习笔记 应用示例 二、视图切换定制 2.1 基础说明 要创建...

灰大羊
2015/08/12
0
0
IOS 委托和协议区别和联系 (-)

IOS上的协议类似于C#、Java上面的接口,他是从类中抽出来的一系列方法,但方法的实现是在实现这个协议的类中,任何实现这个协议的类都需要实现协议类中的@require方法; 委托是一种设计模式,...

malawo
2013/08/07
0
0
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
2018/11/15
0
0
疯狂ios讲义之不使用界面布局文件开发UI界面

如果打算使用纯代码来开发UI界面,则不需要设计任何界面布局文件,没有界面布局文件,也就不再需要使用自定义的视图控制器。这样程序可以直接在应用程序委托对象的application: didFinishLau...

博文视点
2014/01/20
2.4K
7
IOS 委托和协议区别和联系 (=)

上一片大致说了一下IOS上面委托和协议的区别和联系,并且举了一个简单的例子,但是例子比较简单,今天做一个用委托模拟button回调的例子。 在一个自定义View上面放一个登陆按钮,并且这个Log...

malawo
2013/08/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

面向对象接口多态

第3天 面向对象 今日内容介绍  接口  多态  笔记本案例 今日学习目标  写出定义接口的格式  写出实现接口的格式  说出接口中成员的特点  接口和抽象类的区别  能够说出使用多...

stars永恒
5分钟前
1
0
摄像头基础介绍

一、摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中...

天王盖地虎626
6分钟前
1
0
浅谈一致性Hash原理及应用

在讲一致性Hash之前我们先来讨论一个问题。 问题:现在有亿级用户,每日产生千万级订单,如何将订单进行分片分表? 小A:我们可以按照手机号的尾数进行分片,同一个尾数的手机号写入同一片/...

Java干货分享
28分钟前
2
0
React SSR样式及SEO的实践

前一篇主要记录了一下SSR配置以及结合Redux的使用。这里简单说一下React SSR中样式处理和更优雅的SEO SSR样式 在React客户端渲染,添加样式很容易。写一个css样式文件,在对应组件中引用。标...

前端小攻略
35分钟前
5
0
华为手机太猛!余承东吹的牛今天都实现了

华为是世界上少有的在2B和2C领域同时取得成功公司。如今,华为消费者业务的营收,已经在华为总营收中占据“半壁江山”。 12月27日,华为董事长郭平在新年致辞中披露,预计2018年华为预计实现...

linux-tao
46分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部