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的建议——我不知道这件事