版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1338198
关键词:协议、委托、代理
协议的声明有两种方式:1.单独建立一个协议(Protocol),声明在类的外部:
@protocol ClassBPtotocol <NSObject>
-(void)classBMethod;
@end
2.声明在类的内部。(声明在@interface的上面)声明在类的内部,当然就不用引入了, 但同样要遵循这个协议。
OC中虽然没有多继承,但是可以通过协议的方式实现多继承即一个类遵循多个协议,这样这个类接可以继承这多个协议的方法了。
@interface ClassC : NSObject <ClassBPtotocol, ClassAProtocol> // 同时遵守两个协议
一个类在拥有了一个协议之后,首先要引入这个协议,然后还得遵守协议,这样才能实现协议中的方法。(协议写在类的外部)
在协议中声明方法:-(void)server;
在类中引入协议+遵守协议:#import "WaiterProtocol.h"
@interface Waiter : NSObject <WaiterProtocol>
引入代理之后会增强程序的扩展性。如:在引进代理之前,我如果要找房子只能让一类人(如中介)去做我的代理,帮我找房子,而引入代理之后,我可以让更多类的人(如:朋友、同学、亲人。。。。)帮我找房子。只要这些类都遵循找房子的协议并且实现里面的方法即可。和继承有些相似。
代理中,委托人要让代理人帮自己去干某些事,委托人就要调用代理人的某些方法,这时,委托人需要将代理人作为自己的一个属性。
@property (nonatomic, assign) id <PersonProtocol> delegate;
这里用到了id,id可以用来表示各种数据类型,只要是遵循了PersonProtocol协议的代理人,委托人都可以调用他们的方法。
self.delegate server;
在主函数中要实现找房子这个功能,委托人要指定自己的具体代理人,指定中介,或是朋友又或是同学帮自己去找房子,而他们找房子的结果也是不一定完全相同的,可以让你有更多的选择。
Person * liangsen = [Person alloc init];
Waiter * everyone = [Waiter alloc init];
liangsen.delegate = everyone;
liangsen buy;
而委托人和代理人的角色是可以相互转换的。如买饭问题。你去饭店买饭,首先你是委托人负责点菜,服务员是代理人负责送菜。点菜的时候,是吃饭人调用服务员的送菜方法。在你吃完饭以后,这时,服务员成了委托人负责收钱,你是代理人负责付钱。收钱的时候是服务员调用吃饭人的付钱方法。(感觉把一件简简单单的事说的好抽象,好复杂。)
在委托人和代理人角色转换的过程中,会有一个重复引用的问题,即A类引入B类的h文件,然后B类又引入A类的h文件,为了防止这种问题,在A类引入B类的h文件之后,B类只需引入A类遵循的协议即可。
@required @optional 默认的权限是@required
解析:从外到内,注意模型
用了协议和代理之后感觉程序的可扩展性增强了。
父类指针指向子类的对象