OC学习篇之---协议的概念和用法 分类: IOS 2014-12-06 16:25 5052人阅读 评论(1) 收藏

在前一篇文章中咱们介绍了OC中类的延展:http://blog.csdn.net/jiangwei0910410003/article/details/41775603,这一篇文章咱们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及咱们后面在写代码都会用到。框架


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

协议就是定义了一组方法,而后让其余类去实现测试


下面来看代码:ui

WithProtocol.hspa

//
//  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

协议的定义格式:.net

@protocol  协议名  <父协议>code

定义方法对象

@endblog

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


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

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

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

这个就和相似与Java中的抽象类了,若是是abstract修饰的就必须实现,因此若是一个协议中没有@optional修饰的方法,那么这个协议就至关于Java中的接口了。


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


再看一下协议的使用:

Student.h

//
//  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

//
//  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会在此处显示黄色标记,这个做用就是给本身添加一个标记,后续在来查看


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


测试类:

//
//  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 char * 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中的抽象类以及接口很是类似

相关文章
相关标签/搜索