zoukankan      html  css  js  c++  java
  • OC中协议的概念以及用法

    OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到。


    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中也是一个很重要的概念,Foundation框架中很多地方都用到了协议,其实和Java中的抽象类以及接口非常相似
  • 相关阅读:
    const用法详解(转)
    [转]Scintilla开源库使用指南
    javascript 流程控制语句 if 语句
    knockout.js 练习一
    深入Node.js的模块机制
    js本地存储解决方案(localStorage与userData)
    linear-gradient 渐变 css3新属性
    制作响应式网站时,用来测试不同宽度下网页展示效果的方法
    zepto.js, django和webpy
    attachEvent 与 addEventListener 的用法、区别
  • 原文地址:https://www.cnblogs.com/GhostKZShadow/p/5105167.html
Copyright © 2011-2022 走看看