OC中协议的概念以及用法
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中协议的概念以及用法的更多相关文章
- (转载)OC学习篇之---协议的概念和用法
在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Jav ...
- OC学习篇之---协议的概念和用法
这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字 ...
- OC中对象拷贝概念
OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语言有不同的解决方式:C++中有拷贝构造函数,Java中需要实现Cloneable接口,在clone方法中进行操作.但是不过OC ...
- OC中协议, 类目, 时间, 延展, 属性
只有继承和协议需要引IMPORT "头文件"; 必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @pr ...
- 关于oc中出现的typedef的用法/定义函数指针
typedef int (^calculateBlock)(int a,int b); 这里面typedef的作用只是给 calculateBlock取了一个 别名,说明以后可以直接使用. calcu ...
- OC中extern,static,const的用法
1.const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 例如 NSString *const SIAlertViewWillDismissNotification; ...
- js中闭包的概念和用法
闭包:主要的作用是 封装变量,收敛权限.防止变量被污染.比如Jquery框架就运用了大量的闭包.为什么呢? 问个问题?框架是如何来避免你声明的变量和它自带的变量不发生的冲突的?????很明显,需要闭包 ...
- OC中的一个特性:延展
OC中的一个特性:延展其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前必须要声明一个这个函数,就是有前置性.OC中为了弥补C语言中的这个问题,就 ...
- OC中类别、扩展、协议与委托
一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...
随机推荐
- MS Sql 查询数据库连接数
SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN (SELECT [DBID]FROM [Master].[dbo].[SYSDA ...
- Java程序员应该知道的10个面向对象理论
英文原文:10-object-oriented-design-principles 面向对象理论是面向对象编程的核心,但是我发现大部分 Java 程序员热衷于像单例模式.装饰者模式或观察者模式这样的设 ...
- Java反射及依赖注入简单模拟
一.编写Dao类 ? 1 2 3 4 5 6 7 8 9 10 11 package cn.com.songjy.annotation; import java.util.Date; publ ...
- 优先队列(priorityqueue)
队列是先进先出的线性表,顾名思义,优先队列则是元素有优先级的队列,出列的顺序由元素的优先级决定.从优先队列中删除元素是根据优先权的高低次序,而不是元素进入队列的次序.优先队列的典型应用是机器调度等. ...
- 启动监听报错:TNS-12537: TNS:connection closed TNS-12560: TNS:protocol adapter error TNS-00507: Connection closed Linux Error: 29: Illegal seek
启动监听程序报错: 说明:在rhel5.8上安装完成oracle11g数据库后,使用netca创建完监听,启动监听时报错.还未使用dbca创建实例. [oracle@rusky-oracle11g ~ ...
- Basic Concepts of Block Media Recovery
Basic Concepts of Block Media Recovery Whenever block corruption has been automatically detected, yo ...
- 为什么Underscore
Underscore是什么? Underscore一个JavaScript实用库,提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象.它是这个问题的答案:“如果我在一个空白 ...
- tnsping慢的问题解决
1.检查网络ping主机或IP是否正常,DNS是否设置正确 2. 检查防火墙设置 3.检查listener.log日志,查看是否有大量连接连入. 4.检查listener.log日志文件是否过大,如果 ...
- css selection改变文字反选的背景颜色
<style type="text/css"><!--.ai::-moz-selection { background:#cc0000; color:#fff; ...
- zoj1107 FatMouse and Cheese
这是一道记忆化搜索,也就是有记录的搜索. 注意点:一次走k步不能拐弯 int bfs(int x,int y) { ; ) return ans[x][y]; ;i<;i++) { ;j< ...