__block 修饰符的特点
1.__block 可以用于解决 block 内部无法修改 auto 变量值的问题
2.__block 不能修饰全局变量, 静态变量(static)
因在 block 的内部是无法修改外部的 auto 变量的, 所以需要通过__block 修饰符来修改外部 auto 变量的值, 看看下面的一段代码:
- #import <Foundation/Foundation.h>
- int main(int argc, const char * argv[]) {
- @autoreleasepool {
- // insert code here...
- __block auto int age = 10;
- void (^block)(void) = ^ {
- age = 20;
- NSLog(@"age is age:%d",age);
- };
- block();
- }
- return 0;
- }
- // 控制台输出
2018-07-03 14:12:51.176447+0800 __block 修饰符[22494:2047905] age is age:20
Program ended with exit code: 0
我们从上面 main 函数中可以得知, 用__block 修饰的 auto 变量, 在 block 内部能够修改 age 的值, 那__block 在底层做了什么呢? 我们来了解下, 下面是 clang 生成的 c++ 源码:
block 修饰符
通过上面代码分析, 修饰符__block 底层实际就是, 编译器通过将
__block 修饰的变量
包装成一个对象, 通过对象去修改其属性 age 的值, 所以有
__block 修饰的 age 变量
和
无 age 修饰的变量
区别是很大的.
- #import <Foundation/Foundation.h>
- #import "RMPerson.h"
- int main(int argc, const char * argv[]) {
- @autoreleasepool {
- // insert code here...
- __block RMPerson *person = [[RMPerson alloc] init];
- void (^block)(void) = ^ {
- NSLog(@"person : %@",person);
- };
- block();
- }
- return 0;
- }
- -----------------RMPerson.h-----------------
- #import <Foundation/Foundation.h>
- @interface RMPerson : NSObject
- @end
- -----------------RMPerson.m-----------------
- #import "RMPerson.h"
- @implementation RMPerson
- - (void)dealloc {
- NSLog(@"RMPerson - dealloc");
- }
- @end
来源: http://www.jianshu.com/p/61d637f89673