iOS开发-Object-CBlock的实现方式

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

前言:我们可以把Block当作一个闭包函数,它可以访问外部变量和局部变量,但默认是不可以修改外部变量。你可以使用它来做回调方法,比起使用代理(Delegate)会更加直观。顺带一提,苹果很多的接口(API)都使用了Block。

一、Block的基本定义

Block的基本写法(也是详细写法):

returnType (^blockName)(params) = ^returnType(params) {//code...};

中文再解释:返回类型 (^Block的名字)(Block的参数) = ^返回类型(Block的参数) { 这里放代码 },例:

int(^myBlock)(intnum1,intnum2) = ^int(intnum1,intnum2){return100;

};

如果你的Block不需要返回类型和参数,那么你可以简写为:

void(^myBlock2)() = ^(){

};

或

void(^myBlock2)(void) = ^void(void){

};

返回类型或参数,没有的话可以用“void”代替。

你也可以把等于号右边,^后的()删除,即是:

void(^myBlock2)() = ^{

};

这样是不是很简洁?

你也可以先定义一个Block函数,但不写函数的实现,我们可以在后面再写具体函数的实现,像这样:

void(^myBlock2)(void);

myBlock2= ^{

};

二、Block作为方法定义

把Block定义在方法里,与上面不同的是,Block的名字不需要在声明时写上,而是在后面,像这样:

- (void)getWtihBlock:(void(^)())block

{//code...//记得要调用blockblock();

}

使用方法:

[self getWtihBlock:^{

NSLog(@"sdf");

}];

下面作了一个详细点的例子,并写了备注:

/**

* 追加自身字符串N次(每次复制前加一个换行\n)

*

* @param string 字符串

* @param count 追加次数

* @param stringBlock 目标Block,其中str参数为结果字符串*///Block也可以定义在方法里,但是不需要定义Block的名字//IOS开发很多的API也用到了Block,像UIView的块动画- (void)getStrWithString:(NSString *)stringCopyCount:(int)count

resultString:(void(^)(NSString *str))stringBlock

{

NSMutableString*newString = [NSMutableString stringWithString:string];for(NSUInteger i =0; i < count; i++) {

NSUInteger len= [stringlength];

NSString*insertString = [NSString stringWithFormat:@"\n%@",string];

[newString insertString:insertString atIndex:len];

}//调用block,传入字符串newStringstringBlock(newString);

}

用法也是一样:

BlockObject *block =[[BlockObject alloc] init];

[block getStrWithString:@"Garvey"CopyCount:3resultString:^(NSString *str) {//str为处理后的结果NSLog(@"str is %@", str);

}];

有时候复杂的Block语法会令到函数的声明难以阅读,所以会经常使用typedef对Block起一个新类型。

typedefvoid(^ResultBlock)(NSString *str);

定义方法时就变成了:

- (void)getStrWithString2:(NSString *)stringCopyCount:(int)count

resultString:(ResultBlock)stringBlock;

让我们对比一下,使用typedef前后:

//使用前- (void)getStrWithString:(NSString *)stringCopyCount:(int)count

resultString:(void(^)(NSString *str))stringBlock;//使用后- (void)getStrWithString2:(NSString *)stringCopyCount:(int)count

resultString:(ResultBlock)stringBlock;

注意:使用方法是一样的,只不过定义变得简单了。

如果你一直在使用代理(Delegate)进行方法回调,那么你现在可以尝试使用Block了。

博文作者:GarveyCalvin

博文出处:http://www.cnblogs.com/GarveyCalvin/

本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航