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是代理方。
使用代理的步骤:
- 创建一个协议,并使被代理方和代理方均遵守这个协议
- 被代理方声明一个代理属性:@property (nonatomic, weak) id<代理协议> delegate;
- 代理方实现代理方法(即协议里声明的方法);
- 设置代理:被代理方对象名.delegate = 代理方对象名;
- 当被代理方需要代理方做事情的时候,用delegate调用代理方法,通知代理方干活;
- 代理方对象执行代理方法。
继续使用上面的例子里的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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架