委托和block是IOS上实现回调的两种机制。Block基本可以代替委托的功能,而且实现起来比较简洁,比较推荐能用block的地方不要用委托。
本篇的demo可以到github上下载,源码下载地址:GitHub - hezhibo/DelegateAndBlock
首先要在B类里面定义block和delegate,代码如下
#import
@protocolUpdateDelegate
- (void)update:(NSString*)title;
@end
@interfaceNextViewController :UIViewController
@property(nonatomic,weak)id delegate;
typedefvoid(^UpdateBlock)(NSString*title);
@property(nonatomic,copy)UpdateBlockblock;
@end
调用时候代码如下:
- (void)back:(UIButton*)sender {
NSString*str =@"AAA";
[selfdismissViewControllerAnimated:YEScompletion:nil];
if(self.block) {
self.block(str);
}
//用Delegate反向传值
if(self.delegate) {
[self.delegateupdate:@"BBB"];
}
}
然后在A类中实现block代码块和delegate方法
block是新方法如下
next.block= ^(NSString*str) {
UILabel*label = (UILabel*)[self.viewviewWithTag:100];
label.text= [NSStringstringWithFormat:@"%@",str];
};
代理首先要遵守协议,然后设置代理
@interfaceViewController()
next.delegate=self; //设置代理
//实现代理方法
#pragma mark --UpdateDelegate
- (void)update:(NSString*)title {
UILabel*label = (UILabel*)[self.viewviewWithTag:200];
label.text= title;
}
OK,以上就是Delegate和block的传值方法,下面是利用Block和代理时需要注意的地方:
capturing ‘self’ strongly in this block is like
/如果不写这句话 下面block里就会出现 :capturing ‘self’ strongly in this block is like
__block DNHorizontalSelectController * blockSelf = self;
__weaktypeof(self) weakSelf =self;
两者的区别:
1.block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.block对象可以在block中被重新赋值,weak不可以。
PS:unsafe_unretained修饰符可以被视为iOS SDK 4.3以前版本的weak的替代品,不过不会被自动置空为nil。所以尽可能不要使用这个修饰符。
weak不增加引用,block增加引用
block 是让修改外部变量的值.weak是避免memory cycle
在ARC下不用block 而是用weak 为了避免出现循环引用
有问题请留言。