前面2篇文章,是对象使用时的注意事项,那么 值类型呢?会是怎样的呢?
clang -rewrite-objc -fobjc-arc -stdlib=libc++ -mmacosx-version-min=10.10 -fobjc-runtime=macosx-10.10 -Wno-deprecated-declarations main.m -o dest.cpp
通过这个命令,可以将 .m 文件转cpp 代码,进行查看
![](https://img.haomeiwen.com/i783864/3ad5d92333756aa7.png)
NSUInteger age = 10;
void (^printBlock)(void) = ^ {
NSLog(@"1 block Age is %ld", age);
};
NSLog(@"2 Age is %ld", age);
age = 100;
NSLog(@"3 Age is %ld", age);
printBlock();
NSLog(@"4 Age is %ld", age);
1,2,3,4 各处的输出是多少? 10, 10, 100, 100
此处,在初始化block的时候,已经给出了其值,也就说block创建时,捕获到的值,此处是 10
__block NSUInteger age = 10;
void (^printBlock)(void) = ^ {
NSLog(@"1 block Age is %ld", age);
age = 300;
};
NSLog(@"2 Age is %ld", age);
age = 100;
NSLog(@"3 Age is %ld", age);
printBlock();
NSLog(@"4 Age is %ld", age);
1,2,3,4 各处的输出是多少?
100,10,100,300
上面的使用,如果你都能得到才对,那说明,你对它的使用,已经比较了解了呢。那么原理是什么呢?
在使用 __block 它修饰的适合,__block NSUInteger age = 10; 变成了结构体指针的形式, block 内部,获取的到的是,指向它的指针。所以,内部的修改,会同步到外部去,而只有在调用block的适合,才会去获取当时 age 对应的值。
网友评论