OC开发知识进阶 - protocol/delegate

一、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;
} 

  

posted @ 2021-08-04 23:07  myLittleGarden  阅读(105)  评论(0编辑  收藏  举报