首页 文章

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

提问于
浏览
362

我收到了一个错误

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

7 回答

  • 36

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

    __block Person *aPerson = nil;
    

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

  • 728

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

    __block
    

    声明必须在首次声明变量时完成,即块的OUTSIDE,而不是它的内部 . 这应该解决关于变量的评论中提到的问题,这些变量不会在块之外保留其值 .

  • 2

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

    例如:

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

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

    __block Person *aPerson = nil;
    
  • 16
    __block Person *aPerson = nil;
    
  • 10

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

  • 9

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

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

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

相关问题