【黑馬程序員】protocol(協議)
2015-08-25 17:22
489 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
protocol的概念及基本使用
协议的其他用法
protocol中required和optional
protocol类型限制
protocol类型限制
protocol代理设计模式
代理模式设计代码实例
在写java的时候都会有藉口interface这个概念,接口就是一堆方法的声明没有实现,而在OC裡面,interface是一个类的头文件声明,并不是真正意义上的藉口的意思,在OC中,接口是由一个叫做协议的protocol来实现的。
这个protocol裡面可以声明一些方法,和java不同的是,它可以声明一些必须实现的方法和选择实现的方法。这个和java是完全不同的。
2.protocol的使用流程
//3、实现协议中的方法
Wrok.h
2.采纳协议
Person.h
3.实现协议中的方法
如果一个类遵守了某个协议,则只需要在这个类的实现(.m)文件中,实现协议的方法既可以了
协议的使用
4.使用图形界面创建协议
选择文件时找到 OS X 下的 Source,选择 Objective-C File->Next,在 File Type中选择Protocol->Next->Creat;
1、protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现
2、只要某个类遵守了这个协议,就拥有了连这个协议中的所有方法声明。
3、只要父类遵守了某个协议,那么子类也遵守。
4、protocol声明的方法可以让任何类去实现,protocol就是协议。
5、OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议 (<>).
6、基协议: NSObject就是基协议,是最根本最基本的协议,其中声明了很多基本的方法。
7、协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一个协议中的方法声明
2.protocol基协议介绍
NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它,它还有名字也叫NSObject的协议,它是一个基协议,最根本最基本的协议,每个新的协议都要遵守NSObject协议
他们主要用于控制方法是否要实现(默认是@required),在大多数情况下,用途在与程序员之间的交流。
id和instancetype的区别
1)instancetype只能作为函数或者方法的返回值
2)id能作为方法或者函数的返回值、参数类型,也能用来定义变量
3)instancetype对比id的好处:能精确的限制返回值的具体类型
传入对象,代替当前类完成了某个功能,称为代理模式
利用协议实现代理模式的主要思路为:
1)定义一个协议,里面声明代理类需要实现的方法列表,比如这里一个代理类需要实现feedBaby与HongSleep方法
2)创建一个代理类(比如BaoMu),遵守上面的代理协议
3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量
4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法
5)main.m或其他使用Baby类的文件中,为Baby类的成员变量赋值
protocol代理模式应用场合
1.当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
2.当对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
3.当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)
protocol的概念及基本使用
协议的其他用法
protocol中required和optional
protocol类型限制
protocol类型限制
protocol代理设计模式
代理模式设计代码实例
protocol的概念及基本使用
1.protocol的概念在写java的时候都会有藉口interface这个概念,接口就是一堆方法的声明没有实现,而在OC裡面,interface是一个类的头文件声明,并不是真正意义上的藉口的意思,在OC中,接口是由一个叫做协议的protocol来实现的。
这个protocol裡面可以声明一些方法,和java不同的是,它可以声明一些必须实现的方法和选择实现的方法。这个和java是完全不同的。
2.protocol的使用流程
//1.定义协议 @protocol 协议名称 <NSObject> //默认遵守NSObject协议 //方法声明列表 @end; //注意:协议默认的要采纳NSObject的协议 //2.采纳协议 //2.1类遵守协议 创建类的时候遵守某个或者某几个协议 ```objective-c @interface 类名 : 父类 <协议名称> @end @interface 类名 : 父类 <协议名称1, 协议名称2> @end //2.2某个协议也可以遵守某个或者某些协议,一个协议可以遵守其他多个协议 @protocol 协议名称 <其他协议名称> @end @protocol 协议名称 <其他协议名称1, 其他协议名称2,...> @end <div class="se-preview-section-delimiter"></div>
//3、实现协议中的方法
**3.protocol的基本使用** 1.定义协议 <div class="se-preview-section-delimiter"></div> ```objective-c Run.h #import <Foundation/Foundation.h> @protocol Run<NSObject> -(void)eat; -(void)run; @end
Wrok.h
2.采纳协议
#import <Foundation/Foundation.h> @protocol Work<NSObject> -(void)myWork; @end
Person.h
#import "Run.h" #import "Work.h" @interface Person : NSObject<Run, Work> @end
3.实现协议中的方法
如果一个类遵守了某个协议,则只需要在这个类的实现(.m)文件中,实现协议的方法既可以了
Person.m #import"Person.h" @implementation Person -(void)run{ NSLog(@"人会跑"); } -(void)eat{ NSLog(@"人开始吃东西"); } -(void)myWork{ NSLog(@"人要工作"); } @end
协议的使用
main.m #import<Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]){ @autoreleasepool{ Person * p = [Person new]; [p myWork]; [p eat]; [p run]; } return 0; }
4.使用图形界面创建协议
选择文件时找到 OS X 下的 Source,选择 Objective-C File->Next,在 File Type中选择Protocol->Next->Creat;
协议的其他用法
protocol的使用注意:1、protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现
2、只要某个类遵守了这个协议,就拥有了连这个协议中的所有方法声明。
3、只要父类遵守了某个协议,那么子类也遵守。
4、protocol声明的方法可以让任何类去实现,protocol就是协议。
5、OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议 (<>).
6、基协议: NSObject就是基协议,是最根本最基本的协议,其中声明了很多基本的方法。
7、协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一个协议中的方法声明
2.protocol基协议介绍
NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它,它还有名字也叫NSObject的协议,它是一个基协议,最根本最基本的协议,每个新的协议都要遵守NSObject协议
protocol中@required和@optional
@required和@optional是协议方法声明中的两个关键字他们主要用于控制方法是否要实现(默认是@required),在大多数情况下,用途在与程序员之间的交流。
@protocol RunProtocol <NSObject> @required //从这里到@option之间都是必须实现的方法 -(void)run; @optional //下面的都是可以选择实现的方法 -(void)eat; @end
protocol类型限制
类型限制,就是说,如果给一个遵守了某个协议的变量赋值,那么protocol类型限制
类型限制,就是说,如果给一个遵守了某个协议A的变量a赋值对象b,那么对象b也必须遵守协议A。否则不能赋值。//假设有一个Person类,和一个myPro协议 id gF= [[Person alloc] init]; //这样不会报错,因为任何对象都可以赋值给id类型的对象。 //如果Person该类没有遵守myPro协议,那么下面的写法则是错误的,如果遵守,则正确。 id<myPro>gF = [[Person alloc] init]; //在Person没有遵守myPro协议时,Student类遵守了,那么下面的写法是可以的 Person<myPro> p = [Student new];
id和instancetype的区别
1)instancetype只能作为函数或者方法的返回值
2)id能作为方法或者函数的返回值、参数类型,也能用来定义变量
3)instancetype对比id的好处:能精确的限制返回值的具体类型
protocol代理设计模式
代理模式概念:传入对象,代替当前类完成了某个功能,称为代理模式
利用协议实现代理模式的主要思路为:
1)定义一个协议,里面声明代理类需要实现的方法列表,比如这里一个代理类需要实现feedBaby与HongSleep方法
2)创建一个代理类(比如BaoMu),遵守上面的代理协议
3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量
4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法
5)main.m或其他使用Baby类的文件中,为Baby类的成员变量赋值
protocol代理模式应用场合
1.当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
2.当对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
3.当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)
代理模式设计代码实例
main.m #import <Foundation/Foundation.h> #import "Student.h" #import "LinkHome.h" int main(int argc, const char * argv[]){ @autoreleasepool{ Student * stu = [Student new]; LinkHome * linkHome = [LinkHome new]; stu.delegate = linkHome; } return 0; } /* 代理类:linkHome 代理对象: delegate 协议 findHouseProtocol 协议内容:findHouse */
Student.h #import "Foundation/Foundation.h" #import "findHouseProtocol.h" @interface Student : NSObject -(void)needHouse; @property(nonaotmic, strong) id <findHouseProtocol> delegate; @end
Student.m #import "Student.h" @implementation Student NSLog(@"学生需要一个温暖的家"); [self.delegate findHouse]; @end
LinkHome.h #import <Foundation/Foundation.h> #import "findHouseProtocol.h" @interface LinkHome : NSObject <findHouseProtocol> @end
LinkHome.m #import "LinkHome.h" @implementation LinkHome -(void)findHouse{ NSLog(@"恋家正在帮学生找房子"); } @end
findHouseProtocol.h #import <Foundation/Foundation.h> @protocol findHouseProtocol <NSObject> -(void)findHouse; @end
相关文章推荐
- ios开发学习----swift学习之(一)基本运算
- 算法很重要,但是,并非所有,并不是每个人的选择
- 黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
- JAVA问题总结之8-byte和short数据相互加减
- css中的float和相对定位,绝对定位,z-index
- Nginx 虚拟主机配置及负载均衡
- django RESTful研究一第一个测试例子
- hdu2577(模拟 或 DP)
- 程序崩溃时自动记录minidump的c++类
- XX
- 如何使用网页开发自己的app,在网页中的按钮与自己的java代码绑定来实现打电话即javascript代码调用java代码,和java代码来调用javascript代码
- 微信开发自定义菜单数组结构
- 正确使用MySQL INSERT INTO语句
- Ant自动编译打包&发布 android项目
- iOS 判断是否安装SIM卡
- 高维空间中的高斯分布和随机投影
- postgreSQL插入语句返回主键
- xcode6 的 类前缀 的设置方法
- 旋转数组的最小数字
- rsyncd.conf 教程