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是代理方。
使用代理的步骤:
- 创建一个协议,并使被代理方和代理方均遵守这个协议
- 被代理方声明一个代理属性:@property (nonatomic, weak) id<代理协议> delegate;
- 代理方实现代理方法(即协议里声明的方法);
- 设置代理:被代理方对象名.delegate = 代理方对象名;
- 当被代理方需要代理方做事情的时候,用delegate调用代理方法,通知代理方干活;
- 代理方对象执行代理方法。
继续使用上面的例子里的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; }