目录
概念
A类让B类去负责具体实现,只要B类遵守指定协议并实现相关协议方法而不论它是什么类型。
1、可以使用参数值和返回值在二者之间进行数据传递。
2、在A类不开源的情况下,可以保证A类的安全。
最常见的协议就是
UITableViewDelegate(提供交互)
UITableViewDataSource(数据源)
UIScrollViewDelegate
在main函数中就设置了AppDelegate为UIApplication的代理
代理和block的区别
相同点:
都能传递值;
都应避免循环引用;
都应在使用前判断是否实现(如果不判断,会导致崩溃);
不同点:
代理需要创建协议,用weak修饰dele属性,实现dele方法。block用copy修饰
使用步骤
首先创建一个协议
然后在B类中创建一个用weak修饰的delegate属性,
然后在A类中设置B的delegate为A,遵守该协议并实现协议中的方法。
然后在B类中判断delegate是否实现协议中的方法,实现则调用。
第一步:创建一个协议
@protocol 协议名 <NSObject>
@required;
-(void)run;
@optional;
-(void)eat;
@end
第二步:B类中创建delegate属性
@interface B
// dele使用weak:为了避免循环引用
@property (nonatomic,weak) id<协议名> delegate;
@end
第三步:A类遵守协议并实现相关协议方法
@interface A ()<协议名>
@property (nonatomic,strong) B *b;
@end
@implementation A
#pragma mark 协议名
-(void)run{
}
#pragma mark GET
-(B *)b{
if(!_b){
_b=[B new];
_b.delegate=self;
}
return _b;
}
@end
第四步:B类中判断delegate是否实现协议中的方法,实现则调用
@implementation B
-(void)customMethod{
if([self.delgate respondsToSelector:@selector(run)]){
[self.delegate run];
}
}
@end
网友评论