OC----protocol语法

Protocol(相似java中的接口interface)
  • 简单来讲就是一系列方法的列表,其中声明的方法能够被任何类实现。这种模式通常称为代理(delegation)模式
  • 在iOS和OS X开发中,apple采用了大量的代理模式来实现MVC中View(UI控件)和Controller(控制器)的解耦
 
在java中接口中的方法是公共的,若是你实现了接口,你要实现接口中的全部方法
而OC中的Protocol与java中的接口不太相同,若是要实现Protocol中的方法,能够独立实现,不须要一次实现所有的Protocol内的方法
例如:
@protocol ButtonDelegate<NSObject>
-(void)onClick;
@end

@interface Button:NSObject
@property(nonatomic,retain) id<ButtonDelegate> delegate;
@end

点击按钮例子:

//
初始化一个按钮 Button*btn=[[Button alloc]init]; //初始化一个按钮的监听器 ButtonListener *listener=[[ButtonListener alloc]init]; //设置按钮的监听器 btn.delegate=listener; //点击按钮 [btn onClick];

 

 
 
在Button.m文件中实现click方法:
-(void)onClick{
   [ _delegate onClick]
}

 

 
 
在使用@protocol的时候能够用跟@class相同的用法,在声明的时候不用import.h文件,只是在实现的时候import就能够了,
 
一样,咱们能够重写click方法去实如今监听器里打印出是哪一个按钮被点击了
-(void)click{
   //按钮被点击,通知监听器,并告诉监听器,是哪一个按钮被点击了
   if ([_delegate respondsToSelector:@selector(onClick:)]){
       [_delegate onClick:self];
      }else{
          NSLog(@"监听器并无实现onClick:方法”)
}

 

 
一样的,咱们能够在一个类里边同时实现两个或者多个protocol
例如:
@protocol Study,Learn;
@interface Student:NSObject <Study,Learn>
 
若是在@protocol中使用了@required关键字,那么就表示@required下边的方法都必须实现
例如:
@required
-(void)test;
-(void)test1;
-(void)test2;
对于@required,虽然字面上说是必须实现,可是编译器并不强求某个类必须进行实现
 
若是在@protocol中使用了@optional关键字,那么就表示@optional下边的方法是选择实现的
例如:
@optional
-(void)test4;
 
查看某个类的对象有没有遵照某个协议,用conformsToProtocol关键字
例如:
if([stu conformsToProtocol:@protocol(study)]){
}
 
查看某个类的对象有没有实现某个方法,用respondsToSelector关键字
例如:
if([_delegate respondsToSelector:@selector(onClick:)]){
}
相关文章
相关标签/搜索