其实block其实是一个对象,因为它是有isa指针的,另外就是它是一个带自动变量的匿名函数。了解了这个那么接下来我大概总结一下:记住就行了。
1.局部变量
block截取局部变量的只是截获了它的值。看代码的输出就知道了:
void blockTest()
{
int num = 1;
void (^block)(void) = ^{
NSLog(@"%d",num);
};
num = 2;
block();
}
int main(int argc, char * argv[]) {
@autoreleasepool {
blockTest();
}
}
输出的num结果是1,并不是2.也就是说只是一个值传递。
2.static修饰的变量
block截获的是变量的指针,看代码输出:
void blockTest()
{
static int num = 1;
void (^block)(void) = ^{
NSLog(@"%d",num);
num = 3;
};
num = 2;
block();
NSLog(@"%d",num);
}
int main(int argc, char * argv[]) {
@autoreleasepool {
blockTest();
}
}
输出的结果是:2和3.因为截获的是指针并不是值,也就是是指针传递。
3.全局变量
block并不会捕获到全部变量不管是全局变量还是全局static变量都是一样的,看代码:
int a = 1;
static int b = 2
int main(int argc, char * argv[]) {
@autoreleasepool {
void blockTest()
{
NSLog(@"%d====%d",a,b);
}
a = 10;
b = 20;
}
}
结果是:全局变量a和静态全局变量b 获取到的都是最新的值10和20。