将块内的变量分配给块外的变量


381

我遇到错误

变量不可分配(缺少__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;

Answers:


779

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

__block Person *aPerson = nil;

有关更多详细信息,请参阅本教程:块和变量


101
请注意,该__block前缀带有两个下划线。
埃里克·布鲁克托

12
使用__block我的错误消失了,但价值并没有保持不变。这里有任何帮助
User16119012

7
该块在看起来应该被调用之后被很好地调用,换句话说,该块不会立即运行。
汤姆·安德森

1
如果块不能立即运行,则不应接受此答案,因为这使它成为一个巨大的交易破坏者。
durazno

3
对于已发布的问题,此答案是正确的;如果您有其他想法,请随时发布另一个问题。
Devarshi

40

只是提醒我我也犯了一个错误,

 __block

首先声明变量时必须声明,即声明该块的OUTSIDE,而不是在其内部。这样可以解决注释中提到的关于变量不在块外保留其值的问题。


18

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

例如:

__block Person *aPerson = nil;

__block NSString *name = nil;

10

要在块内分配一个在块外的变量,请始终在该变量之前使用__block说明符:

__block Person *aPerson = nil;


3

尝试__weak是否收到有关保留周期的任何警告,否则请使用__block

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

现在,您可以weakPerson在块内引用对象。


3

yes块是最常用的功能,因此为了避免保留周期,我们应该避免使用强变量,包括在块内使用self,尽管要使用_weak或weakself。


0

当我看到相同的错误时,我尝试像这样解决它:

   __block CGFloat docHeight = 0.0;


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

及其工作正常

只需在Variable之前添加“ __block ”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.