前言
介绍下block分类
全局block
代码
- (void)test {
void(^yang1)(void) = ^ { };
yang1();
NSLog(@"%@",[yang1 class]);
}
输出
2021-11-24 19:31:24.613795+0800 09_分类[42172:32561212] __NSGlobalBlock__
堆block
代码 ARC
- (void)test2 {
int age = 30;
// ARC特性 默认关键字__strong修饰变量
void(^yang2)(void) = ^ {
NSLog(@"%d",age);
};
yang2();
NSLog(@"%@",[yang2 class]);
}
代码 MRC
- (void)test2 {
int age = 30;
void(^yang2)(void) = [^ {
NSLog(@"%d",age);
} copy];
yang2();
NSLog(@"%@",[yang2 class]);
}
输出
2021-11-24 19:33:04.207321+0800 09_分类[42669:32565369] 30
2021-11-24 19:33:04.207464+0800 09_分类[42669:32565369] __NSMallocBlock__
栈block
代码 ARC
- (void)test3 {
int age = 30;
void(^__weak yang3)(void) = ^ {
NSLog(@"%d",age);
};
yang3();
}
代码 MRC
- (void)test3 {
int age = 30;
void(^yang3)(void) = ^ {
NSLog(@"%d",age);
};
yang3();
}
输出
2021-11-24 19:33:56.280433+0800 09_分类[42919:32567477] 30
2021-11-24 19:33:56.280616+0800 09_分类[42919:32567477] __NSStackBlock__
区别
用一张网图介绍下分类
总结
没有修饰符的局部变量默认的修饰符为auto,auto类型的局部变量的生命周期为离其最近的大括号内,超出该大括号,该变量被自动销毁
- ARC下变量默认__strong修饰
- ARC下Block创建完成后会被立即拷贝到堆区
- 没有访问auto变量的block就是Global类型
- 生成Block以后,如果这个Block不是全局Block,那么它就是为_NSConcreteStackBlock对象,但是如果其所属的变量作用域名结束,该block就被废弃,在栈上的__block变量也是如此
- 栈block执行copy 就变成了 堆block
- 如果Block和__block变量复制到了堆上以后,则不再会受到变量作用域结束的影响,因为它变成了堆Block