在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调。
block的定义
写一个block
传入两个数,并且计算这两个数的和,
//定义一个block
int (^sumOfNumbers)(int a, int b) = ^(int a, int b) {
return a + b;
};
//使用block
int c = sumOfNumbers (10,20);
NSLog(@"%d",c);
输出的c的值为30;
block引起的循环引用
block在iOS开发中被视作是对象,因此其生命周期会一直等到持有者的生命周期结束了才会结束。另一方面,由于block捕获变量的机制,使得持有block的对象也可能被block持有,从而形成循环引用,导致两者都不能被释放:
遇到这种代码编译器只会告诉你存在警告,很多时候我们都是忽略警告的,这最后会导致内存泄露,两者都无法释放。跟普通变量存在__block关键字一样的,系统提供给我们__weak的关键字用来修饰对象变量,声明这是一个弱引用的对象,从而解决了循环引用的问题:
__weak typeof(self) weakself = self;
self.sum = ^(void){
NSLog(@"%@",[weakself class]);//弱引用不会循环引用
};