昨天看到一个简单而又经典的面试,记录下:
//OC
typedef void(^Myblok)(void);
//--------------------------------------------------------
NSInteger a = 10;
Myblok block = ^{
NSLog(@"%ld",a);
};
a = 20;
block();
//输出:10
上面这段代码打印的值是10。
block截获的是自动变量的瞬时值。因为block保存了自动变量的值,block捕获的自动变量会默认转化为const类型,不可修改了,所以在执行block语法后,即使改变block中使用的自动变量的值block执行时自动变量的值也不会发生改。如果强行在block中改变a的值编译会报错,如果非要改变可以在定义变量的时候在前面加上__block修饰。
//OC
typedef void(^Myblok)(void);
//--------------------------------------------------------
__block NSInteger a = 10;
Myblok block = ^{
//a = 30;
NSLog(@"%ld",a);
};
a = 20;
block();
//输出:20
此时输出20。如果放开注释a=30,则输出30。
如果a是用全局变量定义的,那么self.a输出也是20。
如果用swift的闭包写结果也是20。所以对比几种情况,需要注意区分。
//swift
typealias Myblock = ( ) -> Void
//--------------------------------------------------------
var a = 10
let block:Myblock = ({
print(a)
})
a = 20
block()
//输出:20