您的位置:首页 > 其它

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

2015-12-16 10:12 127 查看
版权声明:本文为CSDN:jiangwei0910410003专栏的专栏

原博主原创文章

本文来自http://blog.csdn.net/jiangwei0910410003/article/details/41776015

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

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

下面来看代码:

WithProtocol.h

[objc] view
plaincopy





//

// WithProtocol.h

// 11_ProtocolDemo

//

// Created by jiangwei on 14-10-11.

// Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import <Foundation/Foundation.h>

@protocol WithProtocol <NSObject>

//默认是必须实现的

//必须实现

@required

- (void)finshTask;

- (void)dontLate;

//可选实现

@optional

- (void)wearNeat;

@end

这里就定义了一个协议WithProtocl

协议的定义格式:

@protocol 协议名 <父协议>

定义方法

@end

注:定义协议的关键字是@protocol,同时协议也是可以继承父协议的

协议中定义的方法还有两个修饰符:

@required:这个表示这个方法是其他类必须实现的,也是默认的值

@optional:这个表示这个方法对于其他类实现是可选的

这个就和类似与Java中的抽象类了,如果是abstract修饰的就必须实现,所以如果一个协议中没有@optional修饰的方法,那么这个协议就相当于Java中的接口了。

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

再看一下协议的使用:

Student.h

[objc] view
plaincopy





//

// Student.h

// 11_ProtocolDemo

//

// Created by jiangwei on 14-10-11.

// Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import <Foundation/Foundation.h>

#import "WithProtocol.h"

@interface Student : NSObject <WithProtocol>

- (void)study;

@end

使用协议很简单,直接在继承类(NSObject)后面 <协议名>即可

Student.m

[objc] view
plaincopy





//

// Student.m

// 11_ProtocolDemo

//

// Created by jiangwei on 14-10-11.

// Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import "Student.h"

@implementation Student

- (void)study{

NSLog(@"study");

}

//直接在.m文件中实现即可,不需要在.h文件中再次定义

#pragma mark - WithProtocol

- (void)finshTask{

NSLog(@"完成任务");

}

- (void)dontLate{

//#warning 代码过几天在补充

NSLog(@"不迟到");

}

- (void)wearNeat{

NSLog(@"穿戴整洁");

}

@end

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

注:这里用到了

#pragma mark - WithProtocol

这个作用就是做一下标记,标记后面的方法都是协议中的方法,这样就可以将一个类中的方法类别分的更细,我们在文件导航栏中进行查看:

光标要放到#param那里,上面的文件栏才会出现@implementation Student

然后我们点击@implementation Student

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

还有一个是

#warning 代码过几天在补充

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

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

测试类:

[objc] view
plaincopy





//

// main.m

// 11_ProtocolDemo

//

// Created by jiangwei on 14-10-11.

// Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import <Foundation/Foundation.h>

#import "Student.h"

int main(int argc, const charchar * argv[]) {

@autoreleasepool {

Student *stu = [[Student alloc] init];

[stu finshTask];

[stu dontLate];

//判断wearNeat方法有没有在Student中实现了

if([stu respondsToSelector:@selector(wearNeat)]){

[stu wearNeat];

}

}

return 0;

}

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

总结

协议在OC中也是一个很重要的概念,Foundation框架中很多地方都用到了协议,其实和Java中的抽象类以及接口非常相似
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: