在块内部分配一个变量给块外部的变量

406

我遇到了一个错误

变量不可赋值(缺少 __block 类型说明符)

在这一行 aPerson = participant;。我该如何确保该块可以访问 aPerson 变量并且 aPerson 变量可以被返回?

Person *aPerson = nil;

[participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {   
    Person *participant = (Person*)obj;

    if ([participant.gender isEqualToString:@"M"]) {
        aPerson = participant;
        *stop = YES;
    }
}];

return aPerson;
8个回答

825
你需要使用以下代码来解决你的问题:

您需要使用此行代码来解决问题:

__block Person *aPerson = nil;

要了解更多详情,请参考这个教程:Blocks and Variables


105
请注意,__block 前缀有 两个 下划线。 - Eric Brotto
14
使用__block修饰符后,我的错误消失了,但是块外面的值没有被保留。这里需要帮助。 - User16119012
7
代码块的执行时间不是立即的,它会在看起来应该被调用的位置之后再被调用。换句话说,代码块不会立刻执行。 - Tom Andersen
1
如果代码块不能立即运行,那么这不应该被接受为答案,因为这将成为一个巨大的问题。 - durazno
3
如果您有不同的情境,请放心提出另一个问题,这个回答针对所发布的问题是正确的。 - Devarshi

43

提醒一下,这是我自己也犯过的错误。

 __block

变量的声明必须在块外部进行,也就是说,在块内部不要进行声明。这应该可以解决在注释中提到的变量在块外部无法保留其值的问题。


19

只需在块内使用 __block 前缀声明和分配任何类型的变量。

例如:

__block Person *aPerson = nil;

__block NSString *name = nil;

11

在块内部为块外的变量分配变量时,应该在该变量之前始终使用__block指定符,你的代码应该像这样:

为了在块内修改变量生效,需要在该变量前加上 __block 指定符。

__block Person *aPerson = nil;

10
__block Person *aPerson = nil;

3

是的,块是最常用的功能,为了避免保留循环,我们应该避免在块中使用强变量,包括self,而是使用_weak或weakself。


3

如果您收到任何关于保留循环的警告,请尝试使用__weak,否则请使用__block

Person *strongPerson = [Person new];
__weak Person *weakPerson = person;

现在你可以在代码块中引用 weakPerson 对象。

3

当我看到相同的错误时,我尝试解决它的方法如下:

   __block CGFloat docHeight = 0.0;


    [self evaluateJavaScript:@"document.height" completionHandler:^(id height, NSError *error) {
        //height
        NSLog(@"=========>document.height:@%@",height);
        docHeight = [height floatValue];
    }];

它现在运行良好。

只需在变量前添加 "__block"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接