iOS 之 block(3)

2020-01-13  本文已影响0人  老猫_2017

前面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 代码,进行查看

借图block声明
    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 对应的值。

上一篇 下一篇

猜你喜欢

热点阅读