一 、基础概念
1、Block基础
Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。
定义Block
1. typedef void (^BoolBlock)(BOOL);//接受一个BOOL参数,没有返回值
2. typedef int (^IntBlock)(void);//没有参数,返回int
3. typedef BoolBlock (^HugeBlock)(IntBlock);//参数和返回值都是block
设置Block块并使用
定义Block块并使用
- (void)someMethod
{
BoolBlock ablock = ^(BOOL bValue) {
NSLog(@"Bool block!");
};
ablock();
}
作为函数的返回值
typedef void (^BoolBlock)(BOOL);
- (BoolBlock)foo()
{
BoolBlock ablock = ^(BOOL bValue) {
NSLog(@"Bool block!");
};
return [[ablock copy] autorelease]; // ARC中不用写autorelease
}
作为函数的参数
- (void)foo(BoolBlock block) { if (block) { block(); } }
作为其他函数的参数
BoolBlock bBlock = ^(BOOL bV){ NSLog(@"Bv")};
HugeBlock hBlock = ^(BoolBlock bB) {bB();};
hBolck(bBlock);
作为全局变量
static int(^maxIntBlock)(int, int) = ^(int a, int b){return a>b?a:b;};
注意: block块的定义要用copy
在类中使用Block
@interface OBJ : NSObject
@property (nonatomic, copy)BoolBlock block;//理由同上啊,同学们
@end
OBJ *obj = ...
obj.block = ^(BOOL bValue) {
NSLog(@"Bool block!");
};
2 、 Block块的标记
如果想要在Block块中修改Block 以外的栈变量,一定要对变量加_block
int main()
{
__block int i = 1024;
BoolBlock bBlock = ^(BOOL bV) {
if (bV) {
i++;
}
};
}