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)
首先,让我们澄清一些术语,因为这是混乱的根源.
如果我们真的技术性,你就不能"通过障碍" - 你永远不能处理"一块".你只能操纵"指向块的指针".类型something (^)()是指向块的指针类型.块文字是指向块类型的表达式.函数Block_copy并Block_release采用指针到块类型.简而言之,使用块执行的所有操作都必须使用指向块的指针.
在Objective-C中,块是对象.您将认识到Objective-C中的类似概念,您永远不能直接处理"对象".您只能处理指向对象的指针.
清除后,Objective-C中的所有内容(如C语言)都会按值传递和分配.没有"通过引用传递".
在您显示的代码中,您将按值传递指向块的指针.该指针指向一个块对象,它是,驻留在堆栈帧上.如果有人在这个指针上调用copy(并且你的代码不确定会发生这种情况,但是假设它发生了),那么copy函数将返回另一个指向堆中新块对象的指针.
| 归档时间: |
|
| 查看次数: |
628 次 |
| 最近记录: |