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

问题描述 投票:371回答:7

我收到了一个错误

变量不可分配(缺少__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
7个回答
755
投票

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

__block Person *aPerson = nil;

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


38
投票

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

 __block

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


17
投票

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

例如:

__block Person *aPerson = nil;

__block NSString *name = nil;

10
投票

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

__block Person *aPerson = nil;

10
投票
__block Person *aPerson = nil;

3
投票

如果你得到关于保留周期的任何警告,请尝试__weak,否则使用__block

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

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


3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.