【OC语法】Protocol协议的介绍

转载 2015年11月17日 16:48:55

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

协议就是定义了一组方法,然后让其他类去实现


下面来看代码:

WithProtocol.h

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  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在CODE上查看代码片派生到我的代码片
  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在CODE上查看代码片派生到我的代码片
  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在CODE上查看代码片派生到我的代码片
  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中的抽象类以及接口非常相像

OC语言之Protocol基本使用

# Protocol基本概念 ##1.protocol 基本概念 - Protocol翻译过来, 叫做”协议”     +在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明...
  • u012938194
  • u012938194
  • 2016年02月21日 21:03
  • 3004

OC中协议(Protocol)的小结

协议基础语法 | 用协议实现代理 | 用协议实现不同对象之间的传值 | 用协议实现回调 | 用协议实现多继承 附有详细源代码和注释...
  • Macro_13
  • Macro_13
  • 2014年12月18日 15:07
  • 3452

Objective-C 【protocol-协议 的了解使用】

——————————————————————————————————————————— protocol(协议) (1)引文:OC中的protocol和Java中的接口(interface)比...
  • Felicity294250051
  • Felicity294250051
  • 2015年09月07日 08:16
  • 1686

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

在前一篇文章中我们介绍了OC中类的延展:http://blog.csdn.net/jiangwei0910410003/article/details/41775603,这一篇文章我们在来看一下OC中...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014年12月06日 16:25
  • 33351

OC语法<3.3> OC中特有的语法:Protocol协议

Protocol协议:  1:协议其实很简单,协议就是规定,谁遵循了我的协议,谁就能够指向我,比如说,小明实现了好人协议,那么小明就是一个好人  2:协议本身只是提供方法的声明,并不实现方法,谁遵循了...
  • vdnsbvjklsda
  • vdnsbvjklsda
  • 2014年12月12日 00:16
  • 398

OC协议protocol详解

1、protocol协议的基本用途: (1)可以用来声明一大堆方法(不能声明成员变量) (2)只要某个类遵守了这个协议,就相当于拥有了这个协议中的所有方法声明。 (3)只要父类遵守了某个协议,就相当于...
  • u013087513
  • u013087513
  • 2015年08月17日 22:10
  • 607

OC中的协议(@protocol)

我们之前讲过非正式协议(NSObject的类目),那么肯定还有正式协议。在OC中,一个类可以实现多个协议,通过协议可以弥补单继承的缺陷。但是协议跟继承不一样,协议只是一个方法的列表,方法的实现得靠遵循...
  • qq_35757299
  • qq_35757299
  • 2016年08月17日 15:55
  • 128

OC特有语法—Protocol

(一)简介 1.Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现。 2.只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明。 3.只要父类遵...
  • l841017122
  • l841017122
  • 2015年07月30日 09:55
  • 200

OC语言的protocol协议

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 1. protocol是用来声明一大堆方法的(不能声明成员变量) 2. 只要某个类遵守了这...
  • wl635512958
  • wl635512958
  • 2014年12月08日 16:18
  • 243

17、OC 协议(protocol)

协议的作用与Java中接口的作用非常类似,用于定义类应该遵守的规范,协议不提供实现,只定义规范。协议中定义多个类的公共行为规范,协议通常定义一组公用方法,方法的实现交给类去完成。 协议的基本语法格式...
  • li460998973
  • li460998973
  • 2014年12月09日 17:10
  • 913
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【OC语法】Protocol协议的介绍
举报原因:
原因补充:

(最多只允许输入30个字)