A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhuhoulin 中级黑马   /  2015-7-25 23:51  /  617 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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代理设置模式概念

      3.protocol代理模式应用场合




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马