一、block 简介
Block是苹果在ObjectC为C、C++以及Objective-C添加的特性,使得这些语言可以用类lambda表达式的语法来创建闭包。 block不需要写protocol、函数等、注重结果的传输,写法比委托简便。 block的声明:
<返回值类型> + (^<block名字>) + (<参数类型1>, <参数类型2>...)
二、block使用
1. block的写法大概就是这样:
void (^blockTest)(void) = ^{
NSLog(@"block");
};
blockTest();
2. 带参数的话可以这样写:
^ BOOL (int left, int right){
return a > b;
}
3. 如果不写入参,可以写:
(void)^{
NSLog(@"block的使用");}
;
4. 当然返回也可以省略,不过编译器可能会有警告:
^{
NSLog(@"最简捷的block的使用");}
;
5. 定义一个block的变量:
void (^blockWithParm)(int parm) = ^(int count){
NSLog(@"有参无返回值的定义和使用:%d", count);
};
blockWithParm(100);
6. block就可以作为另一个函数的参数
void a(){
void (^block)(int parm) = ^(int count){
NSLog(@"有参无返回值的定义和使用:%d", count);
};
funcWithParm(block);
}
void funcWithParm(void (^block)(int parm))
{
block(10);
}
7. block 作为类的属性(使用typedef)
在头文件中定义
typedef void (^blockTest)();
@property (nonatomic,copy) blockTest myblock;
在m文件中调用:
if(_myblock){
_myblock();
}
其它类使用该属性
_testClass.myblock = ^{
NSLog(@"block");
}
三、OC自带的使用block的API示例
遍历元素
NSArray *arrChar=[@"A/B/C/D/E/F" componentsSeparatedByString:@"/"];
[arrChar enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"\nindex:[%d], value:[%@]",idx,obj);
if(idx == 4)
{
*stop=YES;
}
}];
|