iOS中我们经常会遇到正反向传值,正向传值就不用多介绍了,就是属性传值(当然也可以有其他方式,这里不做介绍了). 那么反向传值呢? 或许很多人爱用通知,单例,来实现. 那么你必须要了解通知在性能上是不如代理高的.block本身就是对C语言的回调的封装,当然效率自然高了. 我们就代理和block来展开示例吧.
1.委托,代理传值.
委托就是把自己不想干的事委托给能够完成某件事的对象来干,那么能够完成这件事的对象就是我们所说的代理. 委托代理在我们封装的模块中最为常见用到,比如自己自定义的view,让控制器代理去实现功能. 我这里举个例子,我想让自定义的view委托控制器去修改名字.
2.block
block相对于委托代理,就更加方便了,特别在传值的时候,基本上直接用block,更方便.但是要注意block里防止对象的循环引用.直接上代码
.h中的实现如下
#import<Foundation/Foundation.h>
#import<UIKit/UIKit.h>
@protocol ChangeBoxNameDelegate <NSObject>
- (void)ensureBtnActon:(NSString*)sender;
@end
@interface ChangeNameView : NSObject@property(nonatomic,weak)id<ChangeBoxNameDelegate> delegate;//代理
//注意这处一定要用weak修饰.防止循环引用
typedef void(^UpdateDataBlock)(NSString * str); //block
@property (nonatomic,copy)UpdateDataBlock block;
@end
.m中的实现
#import "ChangeNameView.h"
@implementation ChangeNameView
-(void)ensureBtnDo
{
if (self.delegate &&[self.delegate respondsToSelector:@selector(ensureBtnActon:)]) {
[self.delegate ensureBtnActon:@"回调的值"];//让他的当前的代理来实现功能.
}
//或者运用block
if(self.block){
self.block(@"回调的值");
}
}
//在需要代理的地方创建该类的对象,让该类的对象实现代理方法,遵守委托协议即可:
ChangeNameView * change = [[ChangeNameView alloc]init];
change.delegate = self;
然后实现代理方法
- (void)ensureBtnActon:(NSString*)sender
{
//sender就是回调的参数
}
用block的话就思路是一样的.即
ChangeNameView * change = [[ChangeNameView alloc]init];
change.blcok = ^()(NSString *str){
//这里的str就是回调的参数
};