iOS阶段学习第19天笔记(协议-Protocol)
iOS学习(OC语言)知识点整理
一、关于协议(Protocol)的介绍
1)概念:协议指多个对象之间协商的一个接口对象,协议提供了一些方法用在协议的实现者和代理者
之间通讯的一种方式
2)声明一个协议@protocol协议的名字<基协议> 一个协议可以遵守另一个协议:
基协议(这个协议就拥有了基协议中所有方法的声明)
3)协议中不能声明成员变量,只能有方法声明。
4)协议中声明方法,默认是required 表明方法是必须要实现的,否则会有系统警告,但不会报错
5)协议中@optional表明方法是可选的(可以实现也可以不实现)
6)使用协议:某个类遵守协议,类名后面<协议名> ;所谓遵守协议就是:类拥有了协议中所有方法的声明,
必须实现协议中规定的方法;一个类可以遵守多个协议(类拥有所有协议中声明的方法,必须实现所有
协议中规定的方法)
7)一个协议可以遵守另一个协议,遵守协议后就拥有了另一个协议所有方法的声明,同时还可以添加自己的方法
8)一个协议可以遵守多个协议,并拥有所有基协议的方法
9)协议的声明与使用方法 实例代码:
1、添加一个基于Protocol命名为MyProtocol的.h 文件 声明一些协议方法 例如:
1 #import <Foundation/Foundation.h> 2 @protocol MyProtocol <NSObject> 3 //协议中不能声明成员变量,只有方法 4 //{ 5 // int _a; 6 //} 7 //协议中声明方法,默认是required 8 -(void)test1; 9 -(void)test2; 10 //@required表明方法是必须要实现的 11 @required 12 -(void)test3; 13 //@optional表明方法是可选的(可以实现也可以不实现) 14 @optional 15 -(void)test4; 16 @end
2、定义一个Person类 在.h文件中使用协议MyProtocol 例如:
1 #import <Foundation/Foundation.h> 2 #import "MyProtocol.h" 3 @interface Person : NSObject<MyProtocol> 4 @property(nonatomic,copy)NSString *name; 5 -(void)print; 6 @end
3、在Person类的.m文件中实现协议方法 例如:
1 #import "Person.h" 2 @implementation Person 3 -(void)print 4 { 5 NSLog(@"person:%@",self.name); 6 } 7 //实现协议中规定的方法 8 -(void)test1 9 { 10 NSLog(@"test1"); 11 } 12 -(void)test2 13 { 14 15 } 16 -(void)test3 17 { 18 19 } 20 21 @end
4、在main文件中执行方法 例如:
1 Person *p1=[[Person alloc]init]; 2 //判断p1所属的类是否遵守了协议 3 if([p1 conformsToProtocol:@protocol(MyProtocol)]){ 4 //判断p1所属的类是否实现了方法 5 if([p1 respondsToSelector:@selector(test1)]){ 6 [p1 test1]; 7 } 8 } 9 10 NSObject *obj1=[[NSObject alloc]init]; 11 obj1=nil; 12 NSObject *obj2=@"hello"; 13 obj2=nil; 14 //对obj3指向的对象做一个限制 15 NSObject<MyProtocol> *obj3=@"abc"; 16 //obj4可以指向任意类型的对象,但是必须遵守MyProtocol协议 17 id<MyProtocol> obj4=[[Person alloc]init]; 18 Person<MyProtocol> *obj5=[[Person alloc]init];
10)OC中没有多继承,但可以通过协议实现,可通过使用多个协议来实现类似多继承的方法。
11)协议主要用来统一规范接口;统一接口的方法:继承和协议
12)协议与继承的区别
1、继承也可以统一规范接口:子类继承父类所有的方法(可以不用重写,除非父类的方法不适合子类),
重写后的方法名与父类一样,达到了统一接口的目的;子类中可以增加成员变量
2、协议:一个类遵守协议,类就具有协议中所有的方法,如果多个类都遵守同一个协议,这些类都有协议
中规范的方法,达到了统一接口的目的;协议中不能有成员变量