提问



我收到了一个错误



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

最佳参考


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


__block Person *aPerson = nil;


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

其它参考1


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


 __block


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

其它参考2


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


例如:


__block Person *aPerson = nil;

__block NSString *name = nil;

其它参考3


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


__block Person *aPerson = nil;

其它参考4


__block Person *aPerson = nil;

其它参考5


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

其它参考6


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


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


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