OC中协议的概念以及用法

OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到。

OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的。
协议就是定义了一组方法,然后让其他类去实现

下面来看代码:
WithProtocol.h
[objc]  view plaincopy 
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  
这里就定义了一个协议WithProtocl
协议的定义格式:
@protocol  协议名  <父协议>
定义方法
@end
注:定义协议的关键字是@protocol,同时协议也是可以继承父协议的

协议中定义的方法还有两个修饰符:
@required:这个表示这个方法是其他类必须实现的,也是默认的值
@optional:这个表示这个方法对于其他类实现是可选的
这个就和类似与Java中的抽象类了,如果是abstract修饰的就必须实现,所以如果一个协议中没有@optional修饰的方法,那么这个协议就相当于Java中的接口了。

这里要注意的是,上面的代码中NSObject不是我们之前说的NSObject类了,而是NSObject协议,他也是OC中第一个协议,这个名字相同在OC中是没有关系的。

再看一下协议的使用:
Student.h
[objc]  view plaincopy 
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
[objc]  view plaincopy 
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  
然后我们在实现类中,去实现协议中必须要实现的方法
注:这里用到了
#pragma mark - WithProtocol
这个作用就是做一下标记,标记后面的方法都是协议中的方法,这样就可以将一个类中的方法类别分的更细,我们在文件导航栏中进行查看:

光标要放到#param那里,上面的文件栏才会出现@implementation Student
然后我们点击@implementation Student

看到了协议中的方法和类本身的方法就被分开了,这样便于浏览

还有一个是
#warning 代码过几天在补充
这个就是标记此处代码有一个警告,Xcode会在此处显示黄色标记,这个作用就是给自己添加一个标记,后续在来查看

比如,我在开发的过程中,此处的代码还是有一些问题的,但是可能临时不能处理,等以后有时间在回过头来修改,就是打个标记。

测试类:
[objc]  view plaincopy 
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中的抽象类以及接口非常相似

时间: 2024-10-10 18:30:21

OC中协议的概念以及用法的相关文章

OC学习篇之---协议的概念和用法

这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的. 协议就是定义了一组方法,然后让其他类去实现 下面来看代码: WithProtocol.h [objc] vi

(转载)OC学习篇之---协议的概念和用法

在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的. 协议就是定义了一组方法,然后让其他类去实现. 下面来看代码: Wit

OC中协议, 类目, 时间, 延展, 属性

必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @property (nonatomic, assign) id<marryprotocol> husband; 避免Optitonal没有实现的功能 if ([_husband respondsToSelector:@selector(driver)]) { [_husband driver]; } @required//必须实现的协议, 默认协议 - (void)s

OC中对象拷贝概念

OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语言有不同的解决方式:C++中有拷贝构造函数,Java中需要实现Cloneable接口,在clone方法中进行操作.但是不过OC更偏向于Java这种方式,OC中如果一个对象需要被拷贝,他需要实现协议:<NSCopying>.<NSMutableCopying>从名字上我们可以看到,一个协议是用于不可变对象的,一个协议适用于可变对象的 首先来介绍一下对象的拷贝的概念吧:为什么要由对象的拷贝这么一个概念呢?看一个场

黑马程序员------OC中协议和分类

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- OC中没有想C++中的多继承,是利用分类和协议来实现的. 分类是在不影响原有存在类的基础上,为原有类添加属性和方法. 协议:一般只是声明方法.遵守了协议的类,才会去实现协议中的方法. 协议一般和代理的一起使用.分类,一般是为系统中的类添加

关于oc中出现的typedef的用法/定义函数指针

typedef int (^calculateBlock)(int a,int b); 这里面typedef的作用只是给 calculateBlock取了一个 别名,说明以后可以直接使用. calculateBlock类似于*所以可以有类似的用法,以后可以直接使用calculateBlock来定义方法.例: - (int)calculateWithNumber1:(int)number1 andNumber:(int)number2 andCalculate:(calculateBlock)ca

OC中协议Protocol的小结

//协议的基础语法 //遵从协议的类,可以声明出遵从协议的对象 Dog * dog = [[Dog alloc] init]; //普通id指针能指向任何对象,带协议的id只能指向遵从协议的类的对象 //Dog类遵从了MyProtocol协议,实现了协议中的方法 id <MyProtocol> obj = dog; //obj可以使用协议中定义的方法bark [obj bark]; // // main.m // 协议1-基础语法 // // Created by Macro on 14-12

OC中extern,static,const的用法

1.const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 例如 NSString *const SIAlertViewWillDismissNotification;修饰的是SIAlertViewWillDismissNotification 被const修饰的变量是只读的 2.static的作用: 修饰局部变量: 1.延长局部变量的生命周期,程序结束才会销毁. 2.局部变量只会生成一份内存,只会初始化一次. 3.改变局部变量的作用域. 修饰全局变量 1.只能在

iOS中copy的概念及用法

Copy&MutableCopy 使用copy和mutableCopy方法可以创建一个对象的副本. copy 需要实现NSCopying协议 创建的是不可变副本(如NSString.NSArray.NSDictionary) mutableCopy 需要先实现NSMutableCopying协议 创建的是可变副本(如NSMutableString.NSMutableArray.NSMutableDictionary) copy的目的是建立副本,同时修改原始对象和副本不会互相干扰. 深复制&