iOS开发之代理协议
来源:互联网 发布:淘宝BB8机器人 编辑:程序博客网 时间:2024/06/06 03:45
一、【掌握】Protocol概念及基本使用
1、什么是Protocol?
- 1)Protocol中文意思:协议。
- 2)协议中只能声明一些方法。
- 3)遵守了协议,就等于拥有了协议中的所有方法。
2、协议的基本用法:
- 1、协议的定义格式:
@protocol 协议名称 // 各种方法; @end
- 2、协议的使用格式:
@interface 类名 : NSObject <协议名1,协议名2,...> @end
二、【掌握】protocol的基本使用
- 1、想要给不类添加相同方法时,可以使用协议。
- 如:人和狗都能吃东西,都能跑,能跳,但是不存在继承关系。
- 1)定义运动协议,有吃、跑、跳的方法。
@protocol SportProtocol <NSObject> // 跑 - (void)run; // 跳- (void)jump; // 吃 - (void)eat; @end
- 2) 定义1个人类,让人遵守运动协议
// 导入运动协议的头文件 #import "SportProtocol.h" // 遵守运动协议 @interface Person : NSObject <SportProtocol> @end @implementation Person - (void)run{ NSLog(@"这个人在跑跑跑!"); } - (void)jump { NSLog(@"这个人在跳跳跳!"); } - (void)eat { NSLog(@"这个人在吃东西!"); }@end
- 3) 定义1个狗类,让狗遵守运动协议
// 导入运动协议的头文件 #import "SportProtocol.h" // 遵守运动协议 @interface Dog : NSObject <SportProtocol>@end @implementation Dog - (void)run { NSLog(@"Dog在跑跑跑!"); }- (void)jump { NSLog(@"Dog在跳跳跳!"); } - (void)eat { NSLog(@"Dog在吃东西!"); } @end
注意:当遵守了协议,而没有实现协议中的方法时,会报警告(⚠)
三、【掌握】protocol其他用法
1、【理解】protocol的使用注意
- 1)把同一类方法,放到1个协议当中
- 2)1个类可以同时遵守多个协议。
- 3)父类遵守了某个协议,子类也遵守了该协议。
- 4)协议遵守协议:1个协议可以遵守多个协议。
2、【掌握】protocol基协议介绍
@protocol SportProtocol <NSObject>@end * 此处的NSObject就是基协议,意义等同于继承NSObject。 * 继承基协议的好处:能够拥有基协议当中所声明的所有方法。
- 总结:
- 1、需要添加成员变量和方法时,建议使用继承
- 2、只需要添加方法时,建议使用分类
- 3、当很多不同类中,有共同的方法可以抽取时,类之间不存在继承关系,建议使用协议。
四、【掌握】protocol中@required和@optional
- @required:用@required修饰的方法,必须实现。
- @optional:用@optional修饰的方法,可实现,可不实现。
- @required 和 @optional的主要意义:一般用于序员交流用。
五、【掌握】protocol类型限制
1、【掌握】protocol类型限制
- 1)类型限制:
id d = [[Person alloc] init]; 要求:变量d指向的对象必须遵守PlayProtocol协议 id<PlayProtocol> d = [[Person alloc] init]; 要求:要求Person创建出来的对象,必须遵守PlayProtocol协议。 Person < PlayProtocol > *p = [[Person alloc] init]; 真实使用场景: @interface Person :NSObject <PlayProtocol>@end 这样创建的任何对象,都拥有协议当中的方法。
2、【理解】id和instancetype的区别
创建对象: (id)person{ return [[Person alloc] init]; } 这样,子类无法用这个方法创建对象: (id)person { return [[self alloc] init]; } 调用自己没有的方法,程序会崩溃 建议使用:(instanstype)person{ return [[self alloc] init]; }
总结:
- id和instancetype的区别
- 1)instancetype只能作为函数或者方法的返回值
- 2)id能作为方法或者参数的数据类型、返回值,也能用来定义变量。
- 3)instancetype对比id的好处:
- 能精确的限制返回值的具体类型。
六、【理解】protocol的使用补充
- 1、protocol的引用方式
- 类似@class的使用方式
- 在需要遵守协议的地方,使用@protocol 协议名:
// 使用@protocol是告诉编译器,这是一个协议 @protocol SportProtocol; @interface Person : NSObject <SportProtocol> - (void)run;- @end
- 注意在.m文件中
- 1)使用#import引入协议的头文件
- 2)实现协议对应的方法。
- 2、在类的声明文件中,定义协议(不再单独把协议定义在xx.h文件中)
@protocol SportProtocol<NSObject>; - (void)run; @end @interface Person : NSObject <SportProtocol> @end
- 缺点:不够灵活
七、【理解】protocol代理设计模式引入
- 代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢?
- 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情, 而保姆就是这个代理人, 即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款 成为代理人。
- 问题:婴儿饿了要吃东西,困了要睡觉,当婴儿饿了或者困了都需要保姆照顾他,使用类实现此功能?
- 1、制定协议:喂奶,哄睡
- 2、创建相关的类:婴儿,保姆
- 3、实现相关方法。
八、【理解】protocol代理设计模式
1、【掌握】protocol代理设计模式概念
- 代理模式概念
传入的对象,代替当前类完成了某个功能,称为代理模式
利用协议实现代理模式的主要思路为:
- 1)定义一个协议,里面声明代理类需要实现的方法列表,比如这里:一个代理类需要实现:feedBaby与HongSleep方法
- 2)创建一个代理类(比如BaoMu),遵守上面的代理协议
- 3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议 的成员变量。(delegate)
- 4)在Baby类中调用成员变量delegate(代理)的方法,调用代理类的方法。
- 5)main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋。
2、【掌握】protocol代理模式应用场合
- 代理设计模式的场合:
- 当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象)
- 对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象)
- 当对象A无法处理某些行为的时候,想让对象B帮忙处理。(让对象B成为对象A的代理对象)
- 1)监听器的场合
- Teacher想监听Baby的一些行为
- 2)通知的场合
- Baby发生了一些行为,想告知Teacher
- 3)有些事情,不想自己处理,想交给别人处理
- Baby发生了一些行为,但是自己不会处理,可以交给Teacher处理。
0 0
- iOS开发之代理协议
- iOS 开发之协议-代理传值
- IOS开发之协议和代理
- iOS 开发之协议-代理传值
- iOS 开发之协议-代理传值
- iOS开发之协议:代理传值
- iOS 开发之协议-代理传值
- iOS 开发之协议-代理传值
- iOS开发之协议和代理
- iOS开发之协议:代理传值
- IOS开发之协议和代理
- ios 开发之协议,非正式协议,委托(代理)区别
- iOS开发 - 协议与代理
- iOS开发 - 协议与代理
- iOS开发之Protocol (协议) 和delegate(代理)
- 【iOS开发之Objective-C】协议和代理
- iOS 开发之协议
- 【iOS开发技术分享】协议与代理
- Android全局获取Context
- SDUT 2169 Sequence dp减枝区间划分
- 腾讯tlog黑盒实现(伪代码)
- 字符串转化为对应的整数 (9)
- 保证金(Margin)外汇(Forex)交易思维总结完全版
- iOS开发之代理协议
- (转载)Unity3D研究院之处理摄像机与角色之间被挡时的局部透明效果
- 常对象及常成员及静态数据成员和静态成员函数的学习内容。
- C++拷贝构造函数(深拷贝,浅拷贝)
- java计算器
- struts与spring整合
- final修饰符
- Unity3d 顶点着色器传入的顶点数据
- (转载)NGUI研究院之为什么Scene视图中不显示Polygon Collider2D(十七)