IOS开发protocol使用
1.什么是protocol?
protocol(协议)是用来定义对象的属性和行为,用于回调。
2.protocol分类?
协议中有三个修饰关键字@required和@optional和@property。
3.三个修饰关键字的作用
被@required修饰的方法为必须实现的方法;
被@optional修饰的方法为可选实现的方法;
@property用于修饰属性。
一、定义一个protocol
新建文件的时候不要选择objective-c Class;而要选择objective-c protocol。
#import <Foundation/Foundation.h> @protocol ClassADelegate <NSObject> @required//必须实现 - (void)methodA; @optional//可选实现 - (void)methodB; @property NSString *_str; @end
二、定义protocol的实现(只是定义,对外宣称自己实现了)
A.创建一个objective-c Class,在头文件中实现 ClassADelegate。
#import <Foundation/Foundation.h> #import "ClassADelegate.h" @interface ClassA : NSObject <ClassADelegate> @end
3.调用protocol中的方法(类似Java中调用interface中的方法)
#import "ViewController.h" #import "ClassA.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; ClassA *a = [[ClassA alloc] init]; [a methodA]; [a methodB]; }4.运行程序,发现报错
ProtocolAndDelegate[373:60b] -[ClassA methodA]: unrecognized selector sent to instance 0x17001dff0原因分析:在第二步里面,只是定义了实现,为真正实现。
在ClassA.m文件的顶部会有警告提示:
Method 'methodA' in protocol not implemented
methodB被@optional修饰,是可选实现,所有没有警告提示;但是运行的时候依然会报错。
5.真正实现协议中的方法
#import "ClassA.h" @implementation ClassA - (void)methodA{ NSLog(@"ClassA methodA exec"); } - (void)methodB{ NSLog(@"ClassA methodB exec"); } @end
6.再次运行程序
2014-09-25 14:27:17.751 ProtocolAndDelegate[380:60b] ClassA methodA exec 2014-09-25 14:27:17.752 ProtocolAndDelegate[380:60b] ClassA methodB exec
7.respondsToSelector容错处理
协议中的方法如果没有被真正实现,程序是可以编译通过的,但是在运行的时候会出错。特别的是可选实现的方法,未被真正实现的可能性极高,直接调用protocol方法出错的可能性极高。
规定:“出席今天的宴会,可以打领带,也可以不打领带” 绅士打了领带;屌丝为打领带。 此时如果直接去所有赴宴者领带上的花纹,就会出现异常。先判断下这个赴宴者有没有打领带,如果有再获取领带上的花纹。
处理办法如下:
- (void)viewDidLoad { [super viewDidLoad]; ClassA *a = [[ClassA alloc] init]; if ([a respondsToSelector:@selector(methodA)]) { [a methodA]; } if ([a respondsToSelector:@selector(methodB)]) { [a methodB]; } }