OC开发知识进阶 - protocol/delegate

一、protocol  协议

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

  

遵守协议的类定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#import “eat.h”
  
@interface Man : NSObject <Eat>
  
@end
  
@implementation Man
  
- (void)eat {
  NSLog(@"Man eat”);
}
  
- (void)watch {
  NSLog(@"Man watch”);
}
  
@end
<br>===============================<br>
#import “eat.h”
  
@interface Dog : NSObject <Eat>
  
- (void)eat {
  NSLog(@"Dog eat");
}
  
@end

  

调用时:
1
2
3
4
5
6
7
8
9
#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代理
 
1
2
3
4
5
@interface Man : NSObject <Eat>
  
// 声明一个指向代理对象的指针变量,遵循Eat,协议一般使用弱引用,若用强引用,会造成双向代理死锁问题<br>@property (nonatomic,retain) id <Eat> delegate;
  
@end

   

调用时:
1
2
3
4
5
6
7
8
9
10
11
12
#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 @   myLittleGarden  阅读(110)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示