block
(返回值类型)(^块名字)(参数类型) = ^(参数列表){代码实现};
block 是一种特殊的数据类型,可以将 block 当做比较特殊的对象
使用局部变量
block 可以使用在定义之前声明的局部变量(默认的情况下是只读的)
int i = 10;
void (^myblock)() = ^{
NSLog("%d",i);
};
i = 100;
myblock();
输出结果是 10
注意:
1 在定义 block 时 ,会在 block 中建立 当前局部变量内容的副本(拷贝), block 中所用的也就是这个副本
2 后续在对该变量的的任何修改,都不会影响 block 中的这个变量的数值
3 如果需要在 block 中保持局部变量的数值变化,需要使用__ block 关键字
4 使用__block 关键字之后,同样可以再 block 中修改变量数值
传递对象
注意循环引用
@property (nonatomic, strong) NSMutableArray *myBlocks;
#pragma mark 将代码改为调用self的方法
int(^sum)(int, int) = ^(int x, int y) {
return [self sum:x y:y];
};
[self.myBlocks addObject:sum];
#pragma mark 对象被释放时自动调用
- (void)dealloc
{
NSLog(@"DemoObj被释放");
}
self 对 myblocks 强引用 myblock 对sum 强引用 sum 对 self 强引用 产生循环引用的结果就是对象无法释放,由于局部变量默认的都是强引用,离开其所在的作用区域后都会被释放.所以使用__ weak关键字,将局部变量声明为弱引用
__weak DemoObj *weakSelf = self;
int (^int,int) = ^(int,int){
return [weakSelf sum:x y:y];
};
所以在 block 内部,如果碰到 self, 最好能够思考一下,不要造成循环引用