这一篇文章我们在来看一下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. #import <Foundation/Foundation.h>
  9. @protocol WithProtocol <NSObject>
  10. //默认是必须实现的
  11. //必须实现
  12. @required
  13. - (void)finshTask;
  14. - (void)dontLate;
  15. //可选实现
  16. @optional
  17. - (void)wearNeat;
  18. @end

这里就定义了一个协议WithProtocl

协议的定义格式:

@protocol  协议名  <父协议>

定义方法

@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. #import <Foundation/Foundation.h>
  9. #import "WithProtocol.h"
  10. @interface Student : NSObject <WithProtocol>
  11. - (void)study;
  12. @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. #import "Student.h"
  9. @implementation Student
  10. - (void)study{
  11. NSLog(@"study");
  12. }
  13. //直接在.m文件中实现即可,不需要在.h文件中再次定义
  14. #pragma mark - WithProtocol
  15. - (void)finshTask{
  16. NSLog(@"完成任务");
  17. }
  18. - (void)dontLate{
  19. //#warning 代码过几天在补充
  20. NSLog(@"不迟到");
  21. }
  22. - (void)wearNeat{
  23. NSLog(@"穿戴整洁");
  24. }
  25. @end

然后我们在实现类中,去实现协议中必须要实现的方法

注:这里用到了

#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. #import <Foundation/Foundation.h>
  9. #import "Student.h"
  10. int main(int argc, const charchar * argv[]) {
  11. @autoreleasepool {
  12. Student *stu = [[Student alloc] init];
  13. [stu finshTask];
  14. [stu dontLate];
  15. //判断wearNeat方法有没有在Student中实现了
  16. if([stu respondsToSelector:@selector(wearNeat)]){
  17. [stu wearNeat];
  18. }
  19. }
  20. return 0;
  21. }

这里有一个方法respondsToSelector:@selector,这个方法的作用是判断当前对象中是否定义了一个方法,这个方法还是很有用的,如果在Java中,我们可能需要用反射去实现了。

总结

协议在OC中也是一个很重要的概念,Foundation框架中很多地方都用到了协议,其实和Java中的抽象类以及接口非常相似

OC学习篇之---协议的概念和用法的更多相关文章

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

    在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Jav ...

  2. (转载)OC学习篇之---类目的概念和使用

    上一篇文章介绍了OC中的@class关键字的使用,这一篇我们介绍一下,OC中的一个特有的亮点:类目 首先我们来看一下场景,如果我们现在想对一个类进行功能的扩充,我们该怎么做? 对于面向对象编程的话,首 ...

  3. OC学习篇之---类目的概念和使用

    上一篇文章介绍了OC中的@class关键字的使用http://blog.csdn.net/jiangwei0910410003/article/details/41774747,这一篇我们介绍一下,O ...

  4. OC学习篇之---总结和学习目录

    今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...

  5. OC中协议的概念以及用法

    OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习 ...

  6. OC学习篇之---单例模式

    在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单 ...

  7. (转载)OC学习篇之---代理模式

    在前一篇文章我们介绍了OC中的协议的概念,这篇文章我们就来介绍一下OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的. ...

  8. (转载)OC学习篇之---概述

    前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...

  9. OC学习篇之---内存管理介绍和使用

    在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中 ...

随机推荐

  1. js---对象 和 函数this

    一:对象创建的方法 //普通 字面量形式 var obj = { name:'名字', fn:function(){ console.log(this.name); } } //new 实例 var ...

  2. BZOJ 1231 状压DP

    思路: f[i][j] i表示集合的组成 j表示选最后一个数 f[i][j]表示能选的方案数 f[i|(1<< k)][k]+=f[i][j]; k不属于i j属于i且符合题意 最后Σf[ ...

  3. Kinect 开发 —— Kinect studio

    This tool can record all the data coming into an application from a Kinect unit. You can then view, ...

  4. 使用spring-boot 国际化配置所碰到的乱码问题

    写好html静态页面 ,  也加上了编码格式 , 获取国际化展示在浏览器中还是存在乱码 , 开始以为是浏览器编码格式问题 , 做过处理后任没有得到解决 , 具体的处理方案如下: <meta ht ...

  5. 关于Blocking IO,non-Blokcing IO,async IO的区别和理解

    来源:http://shmilyaw-hotmail-com.iteye.com/blog/1896683 概括来说,一个IO操作可以分为两个部分:发出请求.结果完成.如果从发出请求到结果返回,一直B ...

  6. CCNP路由实验之十五 NAT(网络地址转换)

     CCNP路由实验之十五 NAT(网络地址转换) 众所周知,要让自己的电脑连上Internet,必须要到运营商(ISP)申请一个上网账号,依据此账号申请自己的宽频业务(拨号上网.商业固定IP等等) ...

  7. 华为PUSH SDK 接入方法

    本文参考了华为推送平台官网及其Demo:http://developer.huawei.com/cn/consumer/wiki/index.php?title=%E6%8E%A5%E5%85%A5% ...

  8. eclipse- 智能提示设置

    最近自己ubuntu 下的eclipse没办法只能提示了.后来在网上查了方法,完美解决了问题 1.java代码编辑的时候不提示 具体如下 Windows→Preferences→Java→Editor ...

  9. 转:Java的一道面试题----静态变量初始化过程

    public class Test{ private static Test tester = new Test(); //step 1 private static int count1; //st ...

  10. BZOJ2402: 陶陶的难题II(树链剖分,0/1分数规划,斜率优化Dp)

    Description Input 第一行包含一个正整数N,表示树中结点的个数.第二行包含N个正实数,第i个数表示xi (1<=xi<=10^5).第三行包含N个正实数,第i个数表示yi ...