一、协议的具体用法
协议的具体用法就是使用代理。代理设计模式相当于C#当中的委托。
二、如何实现代理
这里介绍一个案例
三、代理两端如何通讯
代理两段的通讯业就是说代理端和被代理端如何通讯的。
四、调用前后顺序的问题
如果说你要调用一个协议,但是你在调用的时候你的协议还没有声明,所以程序会报错,解决办法有2个,第一,可以在前面声明一下,例如:@protocol DogBark;放在#import <Foundation/Foundation.h>下面。第二,前向声明可以声明类,例如,class Dog; 如果我们把协议声明放到了前面,但是类的声明在我们声明的后面,那样又会报错,所以解决办法是我们在前面加一个类的声明。
五、demo
dog.m

#import "Dog.h" @implementation Dog @synthesize ID = _ID; @synthesize delegate; - (id) init { self = [super init]; if (self) { timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES]; // 创建一个定时器 每个1.0s就调用 [self updateTimer:nil]; } return self; } - (void) updateTimer:(id)arg { barkCount++; NSLog(@"dog bark %d", barkCount); // 通知狗的主人 // delegate; [delegate bark:self count:barkCount]; // 调用delegate里面的 bark:count: 方法 // 向主人回报 } @end
dog.h

#import <Foundation/Foundation.h> @class Dog; // @class表示前向申明一个类 // 定义一个人和狗通讯的方式 protocol @protocol DogBark <NSObject> - (void) bark:(Dog *)thisDog count:(int)count; @end @protocol DogBark; // @protocol表示 协议前向申明 @interface Dog : NSObject { NSTimer *timer; int barkCount; int _ID; id <DogBark> delegate; // ownner 狗的主人 } @property int ID; @property (assign) id <DogBark> delegate; @end
Person.m

#import "Person.h" @implementation Person @synthesize dog = _dog; - (void) setDog:(Dog *)dog { if (_dog != dog) { [_dog release]; _dog = [dog retain]; // 通知_dog的主人是 self [_dog setDelegate:self]; } } - (Dog *) dog { return _dog; } - (void) bark:(Dog *)thisDog count:(int)count { // 当狗叫的时候来调用 xiaoLi人的这个方法 NSLog(@"person this dog %d bark %d", [thisDog ID], count); } - (void) dealloc { self.dog = nil; [super dealloc]; } @end
Person.h

#import <Foundation/Foundation.h> #import "Dog.h" @interface Person : NSObject <DogBark> { Dog *_dog; } @property (retain) Dog *dog; @end
分类:
Objective-C
标签:
Objective-C IOS
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库