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

时间:2011-11-01 05:16:56

标签: objective-c compiler-errors objective-c-blocks

我收到错误

  

变量不可分配(缺少__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 个答案:

答案 0 :(得分:753)

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

__block Person *aPerson = nil;

有关详细信息,请参阅本教程:Blocks and Variables

答案 1 :(得分:38)

提醒我自己也犯了一个错误,

 __block
首次声明变量时,必须完成

声明,即块的OUTSIDE,而不是它的内部。这应解决有关变量的评论中提到的问题,而不是在块之外保留其值。

答案 2 :(得分:17)

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

例如:

__block Person *aPerson = nil;

__block NSString *name = nil;

答案 3 :(得分:10)

要在块内部分配一个变量,块之外的变量总是在该变量之前使用__block说明符,你的代码应该是这样的: -

__block Person *aPerson = nil;

答案 4 :(得分:10)

__block Person *aPerson = nil;

答案 5 :(得分:3)

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

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

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

答案 6 :(得分:3)

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

答案 7 :(得分:0)

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

   __block CGFloat docHeight = 0.0;


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

及其正常工作

只需在变量前添加“ __ block ”。