Object-C Block的实现方式
2015-01-07 11:40
295 查看
前言:我们可以把Block当作一个闭包函数,它可以访问外部变量和局部变量,但默认是不可以修改外部变量。你可以使用它来做回调方法,比起使用代理(Delegate)会更加直观。顺带一提,苹果很多的接口(API)都使用了Block。
一、Block的基本定义
Block的基本写法(也是详细写法):
中文再解释:返回类型 (^Block的名字)(Block的参数) = ^返回类型(Block的参数) { 这里放代码 },例:
如果你的Block不需要返回类型和参数,那么你可以简写为:
或
返回类型或参数,没有的话可以用“void”代替。
你也可以把等于号右边,^后的()删除,即是:
这样是不是很简洁?
你也可以先定义一个Block函数,但不写函数的实现,我们可以在后面再写具体函数的实现,像这样:
二、Block作为方法定义
把Block定义在方法里,与上面不同的是,Block的名字不需要在声明时写上,而是在后面,像这样:
使用方法:
下面作了一个详细点的例子,并写了备注:
用法也是一样:
有时候复杂的Block语法会令到函数的声明难以阅读,所以会经常使用typedef对Block起一个新类型。
定义方法时就变成了:
让我们对比一下,使用typedef前后:
注意:使用方法是一样的,只不过定义变得简单了。
如果你一直在使用代理(Delegate)进行方法回调,那么你现在可以尝试使用Block函数了。
博文作者:GarveyCalvin
博文出处:http://www.cnblogs.com/GarveyCalvin/
本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!
必须要努力努力再努力!
一、Block的基本定义
Block的基本写法(也是详细写法):
returnType (^blockName)(params) = ^returnType(params) { // code... };
中文再解释:返回类型 (^Block的名字)(Block的参数) = ^返回类型(Block的参数) { 这里放代码 },例:
int (^myBlock)(int num1, int num2) = ^int(int num1, int num2){ return 100; };
如果你的Block不需要返回类型和参数,那么你可以简写为:
void (^myBlock2)() = ^(){ };
或
void (^myBlock2)(void) = ^void(void){ };
返回类型或参数,没有的话可以用“void”代替。
你也可以把等于号右边,^后的()删除,即是:
void (^myBlock2)() = ^{ };
这样是不是很简洁?
你也可以先定义一个Block函数,但不写函数的实现,我们可以在后面再写具体函数的实现,像这样:
void (^myBlock2)(void); myBlock2 = ^{ };
二、Block作为方法定义
把Block定义在方法里,与上面不同的是,Block的名字不需要在声明时写上,而是在后面,像这样:
- (void)getWtihBlock:(void (^)())block { // code... // 记得要调用block block(); }
使用方法:
[self getWtihBlock:^{ NSLog(@"sdf"); }];
下面作了一个详细点的例子,并写了备注:
/** * 追加自身字符串N次(每次复制前加一个换行\n) * * @param string 字符串 * @param count 追加次数 * @param stringBlock 目标Block,其中str参数为结果字符串 */ // Block也可以定义在方法里,但是不需要定义Block的名字 // IOS开发很多的API也用到了Block,像UIView的块动画 - (void)getStrWithString:(NSString *)string CopyCount:(int)count resultString:(void (^)(NSString *str))stringBlock { NSMutableString *newString = [NSMutableString stringWithString:string]; for (NSUInteger i = 0; i < count; i++) { NSUInteger len = [string length]; NSString *insertString = [NSString stringWithFormat:@"\n%@", string]; [newString insertString:insertString atIndex:len]; } // 调用block,传入字符串newString stringBlock(newString); }
用法也是一样:
BlockObject *block = [[BlockObject alloc] init]; [block getStrWithString:@"Garvey" CopyCount:3 resultString:^(NSString *str) { // str为处理后的结果 NSLog(@"str is %@", str); }];
有时候复杂的Block语法会令到函数的声明难以阅读,所以会经常使用typedef对Block起一个新类型。
typedef void (^ResultBlock)(NSString *str);
定义方法时就变成了:
- (void)getStrWithString2:(NSString *)string CopyCount:(int)count resultString:(ResultBlock)stringBlock;
让我们对比一下,使用typedef前后:
// 使用前
- (void)getStrWithString:(NSString *)string
CopyCount:(int)count
resultString:(void (^)(NSString *str))stringBlock;
// 使用后
- (void)getStrWithString2:(NSString *)string CopyCount:(int)count resultString:(ResultBlock)stringBlock;
注意:使用方法是一样的,只不过定义变得简单了。
如果你一直在使用代理(Delegate)进行方法回调,那么你现在可以尝试使用Block函数了。
博文作者:GarveyCalvin
博文出处:http://www.cnblogs.com/GarveyCalvin/
本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!
必须要努力努力再努力!
相关文章推荐
- iOS开发-Object-C Block的实现方式
- iOS开发-Object-C Block的实现方式
- Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
- Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
- Object转换byte[],byte[]转换Object的传统转换以及AMF的实现方式.(1)
- Object.defineproperty实现数据和视图的联动 ------是不是就是 Angular 模型和视图的同步的实现方式???
- Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
- java 使用ObjectMapper的方式实现Json和bean的转换
- C# 实现 Aop [继承ContextBoundObject方式]
- Object-C : Block的实现方式
- PropertyAnimation属性动画 ObjectAnimator三种方式实现
- YOLO: Real-Time Object Detection深度网络: 在Darknet上的实现方式
- java实现Object和Map之间的转换3种方式
- object-c中通过异步方式实现下载
- IOS开发ObjectC Block的实现方式
- 解决ea【syui 中显示Date类型数据为[object Object]】两种方式:手动实现+JSON.toJSONStringWithDateFormat(obj,"farmat")
- 【java】之3种方式实现Object和Map之间的转换
- 全新无边框窗口实现方式[HTML]
- Delphi编程实现程序快捷方式
- ghost实现 PXE 网络启动方式