Objective c 如何在回调函数中使用旧的变量值(定义回调时的变量值),而不是在回调运行时使用值?
让我们看看这个例子:Objective c 如何在回调函数中使用旧的变量值(定义回调时的变量值),而不是在回调运行时使用值?,objective-c,ios,callback,Objective C,Ios,Callback,让我们看看这个例子: int a = 1; [someOperation onCompletion:^(...) { NSLog("%d", a); }]; a = 2; 比如说,someOperation花了1秒完成。 所以控制台上会有“2” 如何使用定义回调时的变量值定义回调体(这样在本例中回调执行将在控制台上打印“1”) 在JavaScript中,可以按如下方式执行: setTimeout("someFunction("+variable+")", 1000); 而不是 s
int a = 1;
[someOperation onCompletion:^(...) {
NSLog("%d", a);
}];
a = 2;
比如说,someOperation
花了1秒完成。
所以控制台上会有“2”
如何使用定义回调时的变量值定义回调体(这样在本例中回调执行将在控制台上打印“1”)
在JavaScript中,可以按如下方式执行:
setTimeout("someFunction("+variable+")", 1000);
而不是
setTimeout(function() { someFunction(variable); }, 1000);
但是如何在ObjC中完成这件事呢?如果您尝试的话
int a = 1;
int64_t delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
NSLog(@"a=%d", a);
});
a = 2;
你会很高兴地发现答案是
a=1
因为块的标准行为是在创建时捕获它们引用的变量的值,然后在运行时使用这些存储的值。我相信有一种更聪明的说法,但对我来说就是这样。你的假设是不正确的。 块复制局部变量,除非它们是用_block关键字声明的。 因此,在你的情况下:
int a = 1;
[someOperation onCompletion:^(...) {
NSLog(@"%i", a);
}];
a = 2;
NSLog语句将返回1。
如果您这样更改它:
int __block a = 1;
[someOperation onCompletion:^(...) {
NSLog(@"%i", a);
}];
a = 2;
它将返回2,因为在这种情况下,a是通过引用访问的它似乎是正确的。我以前肯定犯了一些逻辑错误,因为我真的认为它不是那样工作的。谢谢你消除了我的错误印象,这似乎是对的。我以前肯定犯了一些逻辑错误,因为我真的认为它不是那样工作的。谢谢你消除了我的错误印象,也谢谢你给我关于_____)block的建议——我不知道这件事