IOS开发ObjectC Block的实现方式
2015-05-06 15:50
357 查看
前言:我们可以把Block当作一个闭包函数,它可以访问外部变量和局部变量,但默认是不可以修改外部变量。你可以使用它来做回调方法,比起使用代理(Delegate)会更加直观。顺带一提,苹果很多的接口(API)都使用了Block。
一、Block的基本定义
Block的基本写法(也是详细写法):
中文再解释:返回类型 (^Block的名字)(Block的参数) = ^返回类型(Block的参数) { 这里放代码 },例:
返回类型或参数,没有的话可以用“void”代替。
你也可以把等于号右边,^后的()删除,即是:
void (^myBlock2)() = ^{
};
这样是不是很简洁?
你也可以先定义一个Block函数,但不写函数的实现,我们可以在后面再写具体函数的实现,像这样:
void (^myBlock2)(void);
myBlock2 = ^{
};
二、Block作为方法定义
把Block定义在方法里,与上面不同的是,Block的名字不需要在声明时写上,而是在后面,像这样:
- (void)getWtihBlock:(void (^)())block
{
// code...
// 记得要调用block
block();
}
使用方法:
[self getWtihBlock:^{
NSLog(@'sdf');
}];
下面作了一个详细点的例子,并写了备注:
/**
* 追加自身字符串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:@'
%@', 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函数了。
出处: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次(每次复制前加一个换行
)
*
* @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:@'
%@', 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函数了。
出处:http://www.cnblogs.com/GarveyCalvin/
相关文章推荐
- iOS开发-Object-C Block的实现方式
- iOS开发-Object-C Block的实现方式
- 黑马程序员——零基础学习iOS开发——12 Object-C block、protocol
- iOS开发-UITextView实现PlaceHolder的方式
- iOS开发经验技巧之iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault)
- iOS项目开发实战——使用三种方式实现页面跳转与参数传递(一)
- iOS项目开发实战——使用三种方式实现页面跳转与参数传递(二)
- iOS项目开发实战——使用三种方式实现页面跳转与参数传递(三)
- ios开发 Block(二) 实现委托
- 大钟的ios开发之旅(4)————简单谈谈ios程序界面实现的三种方式(代码创建,xib和storyboard)
- 【iOS开发-79】利用Modal方式实现控制器之间的跳转
- iOS网络编程:四、Block方式实现异步
- IOS开发基础Object-C( 15)-- block的使用方法
- [IOS 开发] __block的用途和实现原理
- iOS开发—跳转方式实现地图导航功能
- iOS开发技巧系列---使用链式编程和Block来实现UIAlertView
- iOS开发————通信方式之block
- iOS开发 - 商品详情页两种分页模式,只提供思路和实现方式。
- iOS开发之UITableView中计时器的几种实现方式(NSTimer、DispatchSource、CADisplayLink)
- iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现