ios 委托(delegate)和block 传值

委托和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 为了避免出现循环引用

有问题请留言。

你可能感兴趣的:(ios 委托(delegate)和block 传值)