android工程师开发IOS oc浅析(19)之协议

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34476727/article/details/80506024

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

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

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

下面来看代码:

WithProtocol.h


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

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

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


    //  
    //  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中的抽象类以及接口非常相似

OC中的协议 protocol 使用注意

1、当遵守了某个协议后,就相当于这个类有了协议中所有方法的声明

2、protocol 用来声明许多方法的,不能写实现、不能声明成员变量

3、父类遵守了某个协议,那么子类也遵守

4、protocol 声明的方法可以让任何类实现,protocol 就是协议

5、OC中不能继承多个类(单继承)但是能遵守多个协议

6、基协议:是基协议,其中声明了很多基本方法

7、协议可以遵守协议,一个协议遵守了另一个协议就可以拥有另一份协议中的方法声明

8、类如果采纳协议后,实现了协议的方法,这些方法可以被子类继承

协议(protocol)中@required和@optional的使用

1、@required:这个方法必须要实现,默认都是 @required 必须要实现的,不实现方法时会报错,编译不能通过

2、@optional:这个方法选择实现,不实现方法时不会报错,编译时有警告,运行时出错
五、协议@protocol的类型限制

1、可以增加类型限制。例如 :id <协议的名称> 对象名 ;表示赋值只能遵守此协议的值

2、第二种类型限制,类型名 <协议名称> 对象名;

id类型和instancetype区别

1、id能作为方法或者函数的返回值、参数类型,也能用来定义变量

2、instancetype只能作为函数或者方法的返回值

3、instancetype 能精确的限制返回值得具体类型,如果函数返回值类型和接收值不一致时会报出警告
七、@protocol的代理模式

代理模式:传入的对象代替当前的类完成了某个功能,称为代理模式

利用协议实现代理模式的主要思路为:

1、定义一个代理协议,里面声明代理类需要实现的方法列表,

2、创建一个代理类,遵守这个代理协议协议

3、在需要代理的类中,定义对象 类型为 id 类型 且遵守代理协议的成员变量

4、在需要代理的类中调用成员变量(代理)的方法,调用代理类的方法

5、main .m或者其他使用需要代理的类文件中,对需要代理的成员变量赋值
protocol 代理模式的应用场合

1、监听器的场合

2、通知的场合

3、有些事情不想自己处理,交给别人处理的场合

这里简单的介绍了一下规则和注意事项。

猜你喜欢

转载自blog.csdn.net/qq_34476727/article/details/80506024
今日推荐