OC学习笔记之protocol

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)有些事情,不想自己处理,想交给别人处理
             孩子发生了一些行为,但是自己不会处理,但是交给保姆处理。













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值