1.Block是对象,它封装了一段代码。block可以作为函数参数和函数返回值。
2.Block可以访问局部变量,但不能修改(用__block或者static描述变量就可以修改了)
不能修改是因为系统在定义块时就会把局部变量的值保存在块中,不是等到执行的时候才去读取局部变量的值。
3.使用Block的时候注意循环引用问题
下面我们通过代码来看一看。
<pre name="code" class="objc">-(void)test1
{
int number=10;
void (^block)(void)=^{
//无法直接在代码块修改外部变量值,使用__block或者static即可
//number+=1;
NSLog(@"number=%d",number);
};
/*
1.在这里修改了number的值是没有用的
2.系统在定义块时就会把局部变量的值保存在块中,不是等到执行的时候才去读取局部变量的值
*/
number=100;
//block=[block copy];
block();
}
/*
block循环引用问题:
1.ARC中,Block如果引用了__strong修饰符修饰的自动变量,则相当于Block对该变量的引用计数+1
2.block会对内部的对象进行一次retain,也就是说,self会被retain一次,当self释放的时候,需要block对self进行释放,但是block的释放又要等self的dealloc中才会释放。如此循环引用,导致内存泄露。
*/
-(void)test2
{
__weak ViewController *controller=self;
void(^block)(void)=^()
{
NSLog(@"%@",controller.string);
};
block();
}