iOS开发iOS 开发 iOS Developer

iOS回调,代理和block

2016-08-30  本文已影响422人  Frey丶

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就是回调的参数

};

上一篇 下一篇

猜你喜欢

热点阅读