一、概述
Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。
二、热身
先看一个比较简单的Block例子:
1
2
3
4
|
int
multiplier =
7
;
int
(^myBlock)(
int
) = ^(
int
num) {
return
num * multiplier;
};
|
在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?
来,让我们typedef一下
1
2
3
|
typedef
void
(^BoolBlock)(
BOOL
);
//一个只接受一个BOOL参数,没有返回值的block
typedef
int
(^IntBlock)(
void
);
//一个没有参数,返回int的block
typedef
BoolBlock (^HugeBlock)(IntBlock);
//看看,这个HugeBlock的参数和返回值都是block
|
1
|
|
三、更详细的例子
注意,上面的typedef都还有效~
主动调用一下:
1
2
3
4
5
6
7
8
|
- (
void
)someMethod
{
BoolBlock ablock = ^(
BOOL
bValue) {
NSLog
(
@
"Bool block!"
);
};
ablock();
}
|
作为参数返回:
1
2
3
4
5
6
7
8
|
typedef
void
(^BoolBlock)(
BOOL
);
- (BoolBlock)foo()
{
BoolBlock ablock = ^(
BOOL
bValue) {
NSLog
(
@
"Bool block!"
);
};
return
[[ablock
copy
]
autorelease
];
//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解
}
|
类的一个成员:
1
2
3
4
5
6
7
8
|
@interface
OBJ1
:
NSObject
@property
(
nonatomic
,
copy
)BoolBlock block;
//理由同上啊,同学们
@end
OBJ1 *obj1 = ...
obj1.block = ^(
BOOL
bValue) {
NSLog
(
@
"Bool block!"
);
};
|
其他函数的参数:
1
2
3
4
5
6
|
- (
void
)foo(BoolBlock block)
{
if
(block) {
block();
}
}
|
甚至其他block的参数:
1
2
3
4
|
BoolBlock bBlock = ^(
BOOL
bV){
if
(Bv){
/*do some thing*/
}};
HugeBlock hBlock = ^(BoolBlock bB) {bB();};
hBolck(bBlock);
|
啊,全局变量!:
1
2
3
4
5
6
|
static
int
(^maxIntBlock)(
int
,
int
) = ^(
int
a,
int
b){
return
a>b?a:b;};
int
main()
{
printf(
"%d\n"
, maxIntBlock
(2
,10
));
return
0
;
}
|
好了,你知道block大概能怎么用了。
四,特殊的标记,__block
如果要在block内修改block外声明的栈变量,那么一定要对该变量加__block标记:
1
2
3
4
5
6
7
8
9
|
int
main()
{
__block
int
i =
1024
;
BoolBlock bBlock = ^(
BOOL
bV) {
if
(bV) {
i++;
//如果没有__block标记,是无法通过编译的。
}
};
}
|
好了,基础很快,更详细的内容将用来介绍深入的东西。