==========================
协议和代理
==========================
【协议】
@protocol
【协议的作用】:规定了需要实现的接口方法,在委托方和代理方都需要遵从的一个协议。
委托方通过(nt.delegate = self;)这种方式进行委托【注,不仅可以委托自己,也可以委托其他的类】
代理方通过([_delegate test];)这种方式进行方法的代理(替...干了....)
【例如】:
小明是委托方,小刚是代理方。他们之间都遵从一个协议。协议中规定了2个方法(功能);小明把自己委托给了小刚,小刚则拥有了指向小明的对象的指针,通过这个指针可以访问小明的任何方法(必须是协议中规定的方法)
【注】协议中的方法有如下2中权限
1.@required//委托方(小明)必须实现这个方法
2.@optional//委托方(小明)可以实现,也可以不实现这个方法
【注】@required要求的方法如果不实现,则会提示警告,@optional如果不实现,则没有任何问题。
【注】使用哪个协议,必须包含协议的头文件。
【代理和协议的添加方式】
1.包含头文件
2.在委托方添加协议,然后实现协议方法
3.在代理方实现代理对象变量。
4.在委托方,给代理对象变量赋值
5.在需要用到的地方,通过代理对象的变量,去访问委托的方法
#import <Foundation/Foundation.h>
#import "xiaoming.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
xiaoming* xm = [[xiaoming alloc]init];
// 测试用的
[xm method];
}
return 0;
}
#import <Foundation/Foundation.h>
#import "print.h"
#import "xiaoming.h"
#import "xiaogang.h"
@implementation xiaoming
// 在method这个方法里面练习委托和代理的用法
- (void)method
{
xiaogang* xg = [[xiaogang alloc]init];
// 把自己委托给了小刚,这是一个赋值的过程
xg.woshidaili = self;
// 测试代理是否好用
[xg test];
}
- (void)OutPutPersonInfo
{
NSLog(@"我是委托方,我委托小刚去干一件事情");
}
@end
#import <Foundation/Foundation.h>
#import "print.h"
@interface xiaoming : NSObject<print>
- (void)method;
@end
#import <Foundation/Foundation.h>
#import "print.h"
@interface xiaogang : NSObject
// woshidaili 是一个自定义类型 ,类型是:id<print>
// 可以理解为:是id类型,只是这个id类型遵从了协议
// 【注】id后的尖括号肯定是跟着协议的名称
@property id<print> woshidaili;
// 用来测试代理是否好用
- (void)test;
@end
#import "xiaogang.h"
@implementation xiaogang
- (void)test
{
// 通过代理对象的变量 去访问委托方的方法
[_woshidaili OutPutPersonInfo];
}
@end
#import <Foundation/Foundation.h>
@protocol print <NSObject>
// 打印个人信息
- (void)OutPutPersonInfo;
@end
【协议和代理用处】
例如商品页的商品购买,但是用户没登陆,需要先登陆,登陆成功后,需要把状态告诉商品页,商品页判断登陆状态,然后继续进行下一步操作。【注】登陆页就是在商品页中创建出来的一个对象;【代理的回调】
【协议和代理局限性】
只能是2个相关联的类之间进行数据的互相访问。
【例如】小明委托小刚干什么;小刚委托小红干什么
【respondsToSelector方法】
作用:使代码更安全,防止崩溃
// 判断OutPutPersonInfo 方法是否存在,存在跳入方法
if([_woshidaili respondsToSelector: @selector(OutPutPersonInfo:)])
{
[_woshidaili OutPutPersonInfo: @"我是小刚"];
}