一、block基础知识了解
block是一个代码块,ios4.0和Mac OSX10.6引入的新特性,可以极大的简化代码,减少对代理的依赖,以写出更加简洁可读性更强的代码。
block是一个特殊的oc对象,它建立在栈上而不是堆上,这么做一个是为性能考虑,另一个就是为了方便访问局部变量。默认情况下block使用的局部变量都会被复制copy而不是保留,所以它无法改变局部变量的值,如果在变量前面加上__block,那么编译器不会复制变量,而是去找变量的地址,通过地址来访问变量,其实就是直接操作变量本身。由于block是在栈上分配的,如果一旦离开作用域它就会被释放,所以如果你想把block用到别的地方,你必须复制一份,即copy。如在属性的定义中,必须这样写@property(nonatomic,copy) void (^block) NSString *string; 因为block是不能被保留的,所以retain是没有意义的。
内联执行的时候还能传递参数,block本身也可以作为参数在方法和函数间传递,传递给其他函数或者block,这就给了block很大的方便。
OC是对C语言的扩展,block的实现是基于指针和函数指针。对这个首先要了解下闭包的概念,闭包是一个函数或指向函数的指针,再加上该函数执行的上下文变量(有时候称为自由变量)这个很抽象很难理解。其他的人对闭包的解释是:闭包是能够读取其他函数内部的变量。通常我们要获取函数内部的变量,在本质上,闭包就是将函数内部和外部联系起来的一座桥梁。
二、block的简单使用
这里应用其他的作者的技术博客的东西 博客链接 http://www.dreamingwish.com/article/block介绍(一)基础.html
1、来看一个简单的例子
int multiplier = 7;
int(^myBlock)(int) = ^(int num) {
return num * multiplier;
};
typedef int (^IntBlock)(void);//一个没有参数,返回int的block
typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block
3、 我们来看一下block的主动调用
- (void)someMethod
{
BoolBlock ablock = ^(BOOLbValue) {
NSLog(@"Bool block!");
};
ablock();
}
- (BoolBlock)foo()
{
BoolBlock ablock = ^(BOOLbValue) {
NSLog(@"Bool block!");
};
return[[ablock copy]autorelease];//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解
}
@property(nonatomic,copy)BoolBlock block;//理由同上啊,同学们
@end
OBJ1 *obj1 = ...
obj1.block = ^(BOOLbValue) {
NSLog(@"Bool block!");
};
6、其他函数的参数
- (void)foo(BoolBlock block)
{
if(block) {
block();
}
}
7、其他block的参数
BoolBlock bBlock = ^(BOOLbV){if(Bv){/*do some thing*/}};
HugeBlock hBlock = ^(BoolBlock bB) {bB();};
hBolck(bBlock);
8、全局变量
static int(^maxIntBlock)(int,int) = ^(inta, intb){returna>b?a:b;};
int main()
{
printf("%d\n", maxIntBlock(2,10));
return0;
}
9、特殊的标记
如果block内修改block外的声明的栈变量,一定要对该变量加__block标记
int main()
{
__block int i = 1024;
BoolBlock bBlock = ^(BOOLbV) {
if(bV) {
i++;//如果没有__block标记,是无法通过编译的。
}
};
}
本文非完全原创,参考文献
http://www.cnblogs.com/ymonke/p/3511304.html
http://blog.devtang.com/blog/2013/07/28/a-look-inside-blocks/
http://www.dreamingwish.com/article/block介绍(一)基础.html
http://www.raywenderlich.com/zh-hans/18753/如何在-ios-5-中使用-block-2