【问题标题】:Assign a variable inside a Block to a variable outside a Block将块内的变量分配给块外的变量
【发布时间】:2011-12-19 05:58:05
【问题描述】:

我遇到了一个错误

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

【问题讨论】:

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


    【解决方案1】:

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

    __block Person *aPerson = nil;
    

    更多详情请参考本教程:Blocks and Variables

    【讨论】:

    • 请注意__block的前缀是两个下划线。
    • 使用__block 我的错误消失了,但价值没有保留在块外。这里有任何帮助
    • 块在看起来应该被调用的位置之后被调用,换句话说,块不会“立即”运行。
    • 如果块没有立即运行,那么这不应该被接受,因为这会成为一个巨大的交易破坏者。
    • 对于已发布的问题,此答案是正确的,如果您有不同的情况,请随时发布另一个问题。
    【解决方案2】:

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

     __block
    

    必须在第一次声明变量时进行声明,即在块外,而不是在块内。这应该可以解决 cmets 中提到的有关变量未在块外保留其值的问题。

    【讨论】:

      【解决方案3】:

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

      例如:

      __block Person *aPerson = nil;
      
      __block NSString *name = nil;
      

      【讨论】:

        【解决方案4】:

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

        __block Person *aPerson = nil;
        

        【讨论】:

          【解决方案5】:
          __block Person *aPerson = nil;
          

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

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

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

                它的工作正常

                只需在变量前添加“__block”即可。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-09-26
                  • 2021-04-12
                  • 1970-01-01
                  • 2017-12-27
                  • 1970-01-01
                  • 2014-05-16
                  • 1970-01-01
                  相关资源
                  最近更新 更多