块是通过引用还是通过值从堆栈上的一个调用传递到另一个?

Ber*_*rgP 2 iphone objective-c ios objective-c-blocks

当我将块传递给其他方法(而不是用Block_copy或堆@property(copy))时,它是复制还是通过引用传递?

我的意思是:

- (void)processBlock:(MyBlockType)block param:(int)param {

}

- (void)someMethod {
    int b1 = 10;
    int a1 = 9;
    [self processBlock:^int(int number, id object) {
        NSLog(@"block");
        return 1 + a1;
    } param:b1];
}
Run Code Online (Sandbox Code Playgroud)

它是NSStackBlock- 因为它捕获"a"变量,因此它在堆栈上分配.当我将它们传递给另一个方法时,它是复制并存储在processBlock's堆栈的一部分,还是仅通过引用传递?

像那样:

copyOf myBlock
copyOf b1
processBlock
..........
..other variables..
a1
b1
myBlock
someMethod
..........
Run Code Online (Sandbox Code Playgroud)

或者像那样:

*myBlock (jast a pointer)
copyOf b1
processBlock
..........
..other variables..
a1
b1
myBlock
someMethod
..........
Run Code Online (Sandbox Code Playgroud)

new*_*cct 5

首先,让我们澄清一些术语,因为这是混乱的根源.

如果我们真的技术性,你就不能"通过障碍" - 你永远不能处理"一块".你只能操纵"指向块的指针".类型something (^)()指向块指针类型.块文字是指向块类型的表达式.函数Block_copyBlock_release采用指针到块类型.简而言之,使用块执行的所有操作都必须使用指向块的指针.

在Objective-C中,块是对象.您将认识到Objective-C中的类似概念,您永远不能直接处理"对象".您只能处理指向对象的指针.

清除后,Objective-C中的所有内容(如C语言)都会按值传递和分配.没有"通过引用传递".

在您显示的代码中,您将按值传递指向块的指针.该指针指向一个块对象,它是,驻留在堆栈帧上.如果有人在这个指针上调用copy(并且你的代码不确定会发生这种情况,但是假设它发生了),那么copy函数将返回另一个指向堆中新块对象的指针.