在Objective-C的开发过程中,我们经常用到block,这里就简单总结一下block在Objective-C的几种使用方式。
1、简单介绍一下block
代码块Block是对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量、作为参数、作为返回值,特殊地,Block还可以保存一段代码,在需要的时候调用,目前Block已经广泛应用于iOS开发中,常用于GCD、动画、排序及各类回调。
注: Block的声明与赋值只是保存了一段代码段,必须调用才能执行内部代码
常见的是对block的声明。
//typedef returnType (^TypeName)(parameterTypes);
typedef void (^TeseDefVoidBlock)(NSString *);
typedef NSString *(^TeseDefReturnBlock)(NSString *);
如果想深入了解ios中的block,可以去看看这本书《Objective-C高级编程 iOS与OS X多线程和内存管理》,这里面有单独一章在深入讲解block。
2、在函数(方法)中定义block
block的格式
block作为方法中的局部变量使用
returnType (^blockName)(parameterTypes) = ^returnType(parameters) {...};
returnType是返回值类型
blockName是block名称
parameterTypes是参数
具体的例子:其中定义了一个News的类,可以忽略。
/**
在函数方法中局部变量block
*/
- (void)testBlockInMethod{
// 1、无返回值
void (^voidBlock_1)(NSString *) = ^void(NSString *value) {
NSLog(@"value:%@",value);
};
// 去掉后面的void
// void (^voidBlock_1)(NSString *) = ^(NSString *value) {
// NSLog(@"value:%@",value);
// };
voidBlock_1(@"This is void block!");
// 2、有返回值
News *(^returnBlock_1)(NSString *, NSString *) = ^News *(NSString *title, NSString *content){
News *news = [[News alloc]init];
news.title = title;
news.content = content;
return news;
};
// 去掉后面的returnType
// News *(^returnBlock_1)(NSString *, NSString *) = ^(NSString *title, NSString *content){
// News *news = [[News alloc]init];
// news.title = title;
// news.content = content;
// return news;
// };
News *news = returnBlock_1(@"测试标题",@"测试内容");
NSLog(@"title:%@, content:%@",news.title,news.content);
}
3、block作为属性
定义属性的block的格式
block作为类属性
@property (nonatomic, copy) returnType (^blockName)(parameterTypes);
returnType是返回值类型
blockName是block名称
parameterTypes是参数
具体例子如下:
@property (nonatomic, copy) void (^voidBlock_2)(NSString *);
@property (nonatomic, copy) News * (^returnBlock_2)(NSString *, NSString *);
- (void)testBlockAsProperty{
self.voidBlock_2 = ^void(NSString *value) {
NSLog(@"voidBlock_2 : %@", value);
};
self.voidBlock_2(@"Test voidBlock_2!");
self.returnBlock_2 = ^News *(NSString *title, NSString *content) {
News *news = [[News alloc]init];
news.title = title;
news.content = content;
return news;
};
News *news = self.returnBlock_2(@"测试标题",@"测试内容");
NSLog(@"title:%@, content:%@",news.title,news.content);
}
4、block作为函数(方法)的传入参数
block作为方法参数的方法格式
Block作为方法参数
- (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName;
returnType是返回值类型
blockName是block名称
parameterTypes是参数
具体例子如下:
- (void)testVoidBlock:(void (^)(NSString *blockParam))callBack{
// block作为方法参数(block 无返回值)
callBack(@"在方法中 调用了voidBlock");
}
- (NSString *)testReturnBlock:(NSString * (^)(NSString *blockParam))callBack{
// block作为方法参数(block 有返回值)
NSString *value = callBack(@"在方法中 调用了ReturnBlock");
NSLog(@"value = %@",value);
return value;
}
- (void)testRunBlockAsParams{
[self testVoidBlock:^(NSString *blockParam) {
NSLog(@"1、block回调 到这里了 -- %@",blockParam);
}];
NSString *returnValue = [self testReturnBlock:^NSString *(NSString *blockParam) {
NSLog(@"2、block回调 到这里了 -- %@",blockParam);
return [NSString stringWithFormat:@"param:%@",blockParam];
}];
NSLog(@"returnValue : %@",returnValue);
}
5、block作为函数(方法)的返回值
block作为方法返回值的格式
Block作为方法返回值
-(returnType (^)(parameters))blockName;
returnType是返回值类型
blockName是block名称
parameterTypes是参数
具体例子如下:
- (void(^)(NSString *blockParam))blockAsRetrunValue_1{
void(^blockName)(NSString *) = ^(NSString *param) {
NSLog(@"%@",param);
};
return blockName;
}
- (NSString *(^)(NSString *blockParam))blockAsRetrunValue_2{
NSString *(^blockName)(NSString *) = ^NSString *(NSString *param) {
return [NSString stringWithFormat:@"param : %@",param];
};
return blockName;
}
-(void)testRunBlockAsReturn{
void (^voidBlock)(NSString *) = [self blockAsRetrunValue_1];
voidBlock(@"test");
NSString *(^returnBlock)(NSString *) = [self blockAsRetrunValue_2];
NSString *value = returnBlock(@"test");
NSLog(@"%@",value);
}
网友评论