iOS面试题-ARC下如何创建栈上的Block

这题主要是考察如何区分栈,堆,还是全局?
其中栈上block的定义:只用到外部局部变量、成员属性变量,且没有强指针引用的block都是StackBlock。
所以

    __block int static_k = 3;
    __weak void (^myBlock)(void) = ^{
        static_k++;
    };
    myBlock();
    NSLog(@"%@",myBlock);

这种一定是栈上的。
然后在ARC上当block捕获到自动变量时,系统就是自动给block copy一次。所以为了避免这次copy还有2种情况。

    int temp = 10;
    NSLog(@"%@",
          ^(){
        NSLog(@"%d",temp);
    });

当block是方法的参数时,系统不会触发copy操作。

- (void)viewDidLoad {
    int val = 10;
    [self testMethod:^(int num) {
        NSLog(@"val=%d",val);
    }];
}

- (void)testMethod:(void (^)(int num))block {
    NSLog(@"%@",block);
}

引用
第一章:基础概念和使用
第二章:捕获变量
第三章:持有变量

你可能感兴趣的:(iOS面试题-ARC下如何创建栈上的Block)