您的位置:首页 > 其它

OC 协议(protocol)

2018-02-08 17:03 375 查看
协议的作用与Java中接口的作用非常类似,用于定义类应该遵守的规范,协议不提供实现,只定义规范。协议中定义多个类的公共行为规范,协议通常定义一组公用方法,方法的实现交给类去完成。协议的基本语法格式如下:@protocol 协议名 <父协议1,父协议2...>//协议方法
@end
协议支持多继承,可以看到上面的语法格式,多个父协议放在<>中,子协议继承父协议会得到父协议的所有方法。协议的方法需要类去实现,如果类没有实现则会发出警告,但是我们有时定义的协议方法,类并不一定要去实现,OC为我们想到了这一点,通过@optional和@required两个关键词就可以做到。@required:默认行为,实现类必须实现这些方法,如果没有实现,编译器会提示警告。@optional:实现类可以实现这些方法,也可以不实现。
@protocol 协议名 <父协议1,父协议2...>//协议方法@optional//可选的协议方法//...@required//必须实现的协议方法//...@end
实现协议:在类接口定义时需要指明继承的父类,在后面可以指定要实现的协议,实现协议的格式如下:@interface 类名 : 父类 <协议1,协议2...>
@end
下面看一个例子定义一个协议(PrintProtocol.h)[objc] view plain copy<span style="font-size:18px;">#import <Foundation/Foundation.h>  
@protocol PrintProtocol  
//协议方法  
@optional  
-(void)printName;  
@required  
-(void)printMessage;  
@end  
</span>  

定义一个Student类 实现协议PrintProtocol
[objc] view plain copy<span style="font-size:18px;">#import <Foundation/Foundation.h>  
#import "PrintProtocol.h"  
@interface Student : NSObject <PrintProtocol>  
@property (nonatomic,copy)NSString* name;  
@property (nonatomic,assign)int age;  
@end  
  
#import "Student.h"  
@implementation Student  
-(void)printName{  
    NSLog(@"我的名字是:%@",_name);  
}  
  
-(void)printMessage{  
    NSLog(@"姓名:%@,年龄%d",_name,_age);  
}  
@end</span>  

OC中的协议也可以想Java接口一样定义变量,定义变量的可以有以下2种语法:NSObject<协议1,协议2...>* 变量;id<协议1,协议2...> 变量;
下面我们测试协议的使用:[objc] view plain copy<span style="font-size:18px;">#import <Foundation/Foundation.h>  
#import "Student.h"  
int main(int argc, const charchar * argv[]) {  
    @autoreleasepool {  
        Student* stu = [[Student alloc]init];  
        [stu setName:@"小明"];  
        [stu setAge:10];  
        //调用实现的协议的方法  
        [stu printName];  
        [stu printMessage];  
         
        //使用NSObject的方式创建一个协议对象  
        NSObject<PrintProtocol>* op = stu;  
        //使用协议对象调用协议方法  
        [op printMessage];  
        //使用id的方式创建一个协议对象  
        id<PrintProtocol> ip = stu;  
        //使用协议对象调用协议方法  
        [ip printMessage];  
    }  
}</span>  

输出结果:我的名字是:小明姓名:小明,年龄10姓名:小明,年龄10姓名:小明,年龄10
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: