在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到。
OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的。
协议就是定义了一组方法,然后让其他类去实现。
下面来看代码:
WithProtocol.h
1 // 2 // WithProtocol.h 3 // 11_ProtocolDemo 4 // 5 // Created by jiangwei on 14-10-11. 6 // Copyright (c) 2014年 jiangwei. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 @protocol WithProtocol <NSObject> 12 13 //默认是必须实现的 14 15 //必须实现 16 @required 17 - (void)finshTask; 18 - (void)dontLate; 19 20 //可选实现 21 @optional 22 - (void)wearNeat; 23 24 @end
协议的定义格式:
1 @protocol 协议名 <父协议> 2 3 定义方法 4 5 @end
注:定义协议的关键字是@protocol,同时协议也是可以继承父协议的。
协议中定义的方法还有两个修饰符:
@required:这个表示这个方法是其他类必须实现的,也是默认的值。
@optional:这个表示这个方法对于其他类实现是可选的。
这个就和类似与Java中的抽象类了,如果是abstract修饰的就必须实现,所以如果一个协议中没有@optional修饰的方法,那么这个协议就相当于Java中的接口了。
这里要注意的是,上面的代码中NSObject不是我们之前说的NSObject类了,而是NSObject协议,他也是OC中第一个协议,这个名字相同在OC中是没有关系的。
再看一下协议的使用:
Student.h
1 // 2 // Student.h 3 // 11_ProtocolDemo 4 // 5 // Created by jiangwei on 14-10-11. 6 // Copyright (c) 2014年 jiangwei. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 #import "WithProtocol.h" 12 13 @interface Student : NSObject <WithProtocol> 14 15 - (void)study; 16 17 @end
使用协议很简单,直接在继承类(NSObject)后面 <协议名>即可。
Student.m
1 // 2 // Student.m 3 // 11_ProtocolDemo 4 // 5 // Created by jiangwei on 14-10-11. 6 // Copyright (c) 2014年 jiangwei. All rights reserved. 7 // 8 9 #import "Student.h" 10 11 @implementation Student 12 13 - (void)study{ 14 NSLog(@"study"); 15 } 16 17 //直接在.m文件中实现即可,不需要在.h文件中再次定义 18 #pragma mark - WithProtocol 19 - (void)finshTask{ 20 NSLog(@"完成任务"); 21 } 22 - (void)dontLate{ 23 //#warning 代码过几天在补充 24 NSLog(@"不迟到"); 25 } 26 27 - (void)wearNeat{ 28 NSLog(@"穿戴整洁"); 29 } 30 31 @end
然后我们在实现类中,去实现协议中必须要实现的方法。
注:这里用到了:
1 #pragma mark - WithProtocol
这个作用就是做一下标记,标记后面的方法都是协议中的方法,这样就可以将一个类中的方法类别分的更细,我们在文件导航栏中进行查看:
光标要放到#param那里,上面的文件栏才会出现@implementation Student
然后我们点击@implementation Student
看到了协议中的方法和类本身的方法就被分开了,这样便于浏览。
还有一个是#warning 代码,过几天在补充。
这个就是标记此处代码有一个警告,Xcode会在此处显示黄色标记,这个作用就是给自己添加一个标记,后续在来查看。
比如,我在开发的过程中,此处的代码还是有一些问题的,但是可能临时不能处理,等以后有时间在回过头来修改,就是打个标记。
测试类:
1 // 2 // main.m 3 // 11_ProtocolDemo 4 // 5 // Created by jiangwei on 14-10-11. 6 // Copyright (c) 2014年 jiangwei. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 #import "Student.h" 12 13 int main(int argc, const charchar * argv[]) { 14 @autoreleasepool { 15 Student *stu = [[Student alloc] init]; 16 [stu finshTask]; 17 [stu dontLate]; 18 19 //判断wearNeat方法有没有在Student中实现了 20 if([stu respondsToSelector:@selector(wearNeat)]){ 21 [stu wearNeat]; 22 } 23 } 24 return 0; 25 }
这里有一个方法respondsToSelector:@selector,这个方法的作用是判断当前对象中是否定义了一个方法,这个方法还是很有用的,如果在Java中,我们可能需要用反射去实现了。
总结
协议在OC中也是一个很重要的概念,Foundation框架中很多地方都用到了协议,其实和Java中的抽象类以及接口非常相似。