//基本数据类型局部变量 (只获取其值;__block 对截获变量进行赋值操作需要添加)
__block int multiplier = 10;
//对象类型局部变量 (连同所有权修饰符一同截获)
__unsafe_unretained id unsafe_obj = nil;
__strong id strong_obj = nil;
//局部静态变量 (以指针形式截获局部静态变量)
static int static_var = 3;
//全局变量 、静态全局变量 不截获 直接使用
int(^Block)(int) = ^int(int num){
multiplier = 2;
static_var = 4;
NSLog(@"static_var : %d",static_var);
return num * multiplier;
};
NSLog(@"%d",Block(2));
multiplier = 4;
__block 对截获变量进行赋值操作需要添加
需要添加: 基本数据类型、 对象类型
不需要添加 :静态局部变量、全局变量、静态全局变量
__block 修饰的变量变成了对象
__forwarding
不论存在任何内存位置 都可以顺利访问同一个__block 变量
循环引用
//1,自循环
{
_array = @[@"block"];
//解决方法
//__weak NSArray *weakArr = _array;(弱引用)
_strBlock = ^NSString*(NSString* num){
return [NSSting stingWithFormat:@"%@%@",num,_array[0]];
}
_strBlock("hello");
}
//2,MRC下不会产生循环引用,ARC下会产生循环引用,引起内存泄露
{
__block MCBlock *blockSelf = self;
_blk = ^int(int num){
//ARC下解决方法
// int result = num * blockSelf.var;
//blockSelf = nil;(block 长时间不使用还是会造成虚幻引用)
// return result;
return num * blockSelf.var;
};
_blk(3)
}
网友评论