您的位置:首页 > 移动开发 > Objective-C

OC学习笔记之protocol

2015-07-26 00:11 465 查看
protocol的概念及基本的使用

   protocol是正是协议(非正式协议:给NSObject或其子类增加新的方法的类),是一些方法的声明,用于

         其他的类去遵守。如果一个类遵守了一个协议,就应该事先这个协议中必须要实现的方法

   协议的话可以让某个类必须实现某个方法

   接口(interface):在Java中,interface的概念只是一堆方法的声明,没有实现。而在OC里面,interface

         是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中,接口是由一个叫做协议的

         protocol来实现的。在protocol里面,与Java不同的是,他可以声明一些必须实现和选择实现的方法

         这个和Java是完全不同的

protocol的使用流程

     1.定义一个协议(.h文件)

        @protocol 协议名称 <NSObject>//默认遵守NSObject协议

           //方法的声明

        @end;

         

     2.在类中采用指定的协议(Class.h)

        (1)类遵守协议

            创建类的时候遵守某个或者几个协议

            @interface 类名:父类 <协议名称>//创建的类遵守单个协议

            @end

            @interface 类名:父类 <协议名称1,协议名称2>//创建的类遵守多个协议

            @end

     3.实现协议中的方法,必选的和可选的方法(Class.m文件)

     代码实例:

     baseProtocol.h文件:

           @protocol baseProtocol <NSObject>//默认采用NSObject,当然也可以不采用,直接@protocol baseProtocol

           //声明一些方法

           -(void)eat;

           -(void)eat;

           @end

     Person.h文件://遵守baseProtocol协议

           #import "baseProtocol"//引用头文件

           @interface Person:NSObject<baseProtocol>

           @end

     Person.m文件://事先协议中的方法

            #import “Person.h”

            @inmplementation Person

            -(void)run{

                  NSLog(@"人在跑步");

            }

            -(void)eat{

                   NSLog(@"人在吃饭");

            }

      main.m的文件

      #import <Foundation/Foundation.h>

      #import <Person.h>

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

           @autoreleasepool{

                Person *p = [Person new];

                [p eat];//eat方法可以正常执行

                [p run];//run方法可以正常执行

           }

           return 0;

      }

protocol其他用法

    1.protocol使用注意事项

       (1)只是声明方法,不能生命成员变量。

       (2)只要遵守的协议,就拥有了这个协议中的所有方法的声明

       (3)只要父类遵守了某个协议,那么子类也遵守

       (4)protocol声明的方法可以让任何类去实现

       (5)OC不能继承多个类,但是可以能够遵守多个协议。

       (6)基协议:<NSObject>是基协议,是最根本的的协议,其中生命了很多最基本的方法

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

    2.协议之间的继承关系

       A.h协议文件

       #import <Foundation/Foundation.h>

       @protocol A

             方法

       @end

       B.h协议文件

       #import <Foundation/Foundation.h>

       #import B <NSObject,A>

       @protocol B

             方法

       @end

    3.类如果继承了协议后,该类的子类可以继承这些协议中的方法

    4.protocol基协议

       NSObject是一个基类,最根本的类,任何类最终都要继承它。它还有名字也叫NSObject的基协议,

       他是一个基协议,最根本最基础的协议。NSPbject协议中声明很多最基本的方法description,retain

       ,release。建议每个新的协议都要继承该协议。

protocol中的@requierd和@optional

    @requierd和@optional都是协议操作的关键字

    @requierd------它作用域内的方法,必须要实现。默认情况下,也就是不加关键字的情况下,都是

        必须摇实现的

    @optional------它作用域内的方法,可以实现也可以不实现

protocol的类型限制

    1.protocol类型限制问题

       (1)第一种类型限制:给id类型增加限制

           id<houseHold> obj = mm;//表示obj只能复制遵守了houseHold协议的对象。

       (2)第二种:

           Girl<houseHold> *obj2 = mm;//表示给obj2赋值的时候,必须是girl对象,并且遵守houseHold协议

       (3)Girl<houseHold> *obj2 = mm;

           obj2.dog = d;//dog对象遵守dog的某个协议。

protocol代理设计模式的引入

     例子:保姆和婴儿的例子-------婴儿与保姆之间商定一个协议,协议中写明保姆需要做哪些事情。保姆需要

            遵守该协议,于是保姆就要实现协议中的条款成为代理人。

     1.代理设计模式的实现

        (1)制定协议(照顾小孩的协议)

              小孩想吃东西------保姆喂

              小孩想睡觉---------保姆哄她睡觉

        (2)创建相关类

              婴儿类:属性+行为

              保姆类:属性+行为

        代码实现:

        lookBabyProtocol.h协议文件

             #import <Foundation/Foundation.h>

             @protocol lookBabyProtocol <NSObject>//协议声明

             -(void)feedBabyEat;//哄婴儿吃饭

             -(void)HongBabySleep;//哄婴儿睡觉

             @end

        Baby.h头文件

             #import <Foundation/Foundation.h>

             @class "BaoMu.h"//避免循环引用问题

             @interface Baby : NSObject 

             @property (nonatomic,strong) Baomu *bm;

             -(void)wantEat;

             -(void)wantSleep;

             @end

         Baby.m源文件

             #import "Baby.h"

             @implementation Baby

             -(void)wantEat{

                   NSlog(@"baby在哭,想吃饭");

             }

             -(void)wantSleep{

                   NSlog(@"baby在哭,想睡觉");

             }

          BaoMu.h头文件

             #import <Foundation/Foundation.h>

             #import "lookBabyProtocol.h"

             @interface BaoMu : NSObject<lookBabyProtocol>

             @end

          BaoMu.m源文件

              import “BaoMu.h”

              @implementation BaoMu

              -(void)feedBabyEat{

                     NSlog(@"喂孩子吃饭");

              }

              -(void)HongBabySleep{

                      NSlog(@"哄孩子睡觉");

              }

      2.protocol代理设置模式概念

         MVC开发模式:

                    M-model:填充数据,获取网络数据。模型

                    V-View:负责显示。视图

                    C-controller:负责运算。控制器

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

         实现代理模式:

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

            (2)创建一个代理类,遵守上面的协议

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

            (4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法

            (5)main.m或其他使用baby类的文件中,为baby类的成员变量赋值

      3.protocol代理模式应用场合

         (1)监听器的场合

             保姆监听孩子的一些行为

         (2)通知的场合

             孩子发生一些行为,告知保姆

         (3)有些事情,不想自己处理,想交给别人处理

             孩子发生了一些行为,但是自己不会处理,但是交给保姆处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective-c protocol