zoukankan      html  css  js  c++  java
  • OC开发知识进阶

    一、protocol  协议

    协议是多个类(或者说对象)之间协商的一个公共接口,提供一系列方法的声明给类们使用。协议类似于java里的接口,仅可声名方法,无具体实现。
    如: eat.h
    @protocol Eat <NSObject>
     
    @required  //必须实现
    - (void)eat;
     
    @optional
    - (void)watch;  //可选实现
     
    @end
    

      

    遵守协议的类定义
    #import “eat.h”
     
    @interface Man : NSObject <Eat>
     
    @end
     
    @implementation Man
     
    - (void)eat {
      NSLog(@"Man eat”);
    }
     
    - (void)watch {
      NSLog(@"Man watch”);
    }
     
    @end
    
    ===============================
    #import “eat.h” @interface Dog : NSObject <Eat> - (void)eat { NSLog(@"Dog eat"); } @end

      

    调用时:
    #import “eat.h”
    #import “Man.h”
    #import “Dog.h”
     
    int main(int argc, const char *argv[]) {
      Man *man = [[Man alloc] init];
      [man eat];  //输出 Man eat
      return 0;
    }
    

      

    二、delegate 代理

    代理是协议的一个典型应用机制。在上面的例子中,如果man不想eat,可以请dog来做这件事,这就是代理。man是被代理方,dog是代理方。
     
    使用代理的步骤:
    1. 创建一个协议,并使被代理方和代理方均遵守这个协议
    2. 被代理方声明一个代理属性:@property (nonatomic, weak) id<代理协议> delegate;
    3. 代理方实现代理方法(即协议里声明的方法);
    4. 设置代理:被代理方对象名.delegate = 代理方对象名;
    5. 当被代理方需要代理方做事情的时候,用delegate调用代理方法,通知代理方干活;
    6. 代理方对象执行代理方法。
     
    继续使用上面的例子里的eat代理
     
    @interface Man : NSObject <Eat>
     
    // 声明一个指向代理对象的指针变量,遵循Eat,协议一般使用弱引用,若用强引用,会造成双向代理死锁问题
    @property (nonatomic,retain) id <Eat> delegate; @end

       

    调用时:
    #import “eat.h”
    #import “Man.h”
    #import “Dog.h”
     
    int main(int argc, const char *argv[]) {
      Man *man = [[Man alloc] init];
      Dog *dog = [[Dog alloc] init];
     
      man.delegate = dog;
      [man eat];  //输出 Dog eat
      return 0;
    } 
    

      

  • 相关阅读:
    51nod1432 独木舟
    51nod1126 求递推序列的第N项
    Alice, Bob, Oranges and Apples CodeForces
    区间dp
    平面几何基础
    图的割点、桥与双连通分支
    hihocoder 1305 区间求差
    hdu 2444 The Accomodation of Students 【二分图匹配】
    状压dp
    hdu 1525 Euclid's Game【 博弈论】
  • 原文地址:https://www.cnblogs.com/sunada2005/p/15101241.html
Copyright © 2011-2022 走看看