Atribuir uma variável dentro de um bloco a uma variável fora de um bloco

382

Estou recebendo um erro

A variável não é atribuível (falta de especificador de tipo de bloco __)

na linha aPerson = participant;. Como posso garantir que o bloco possa acessar a aPersonvariável e a aPersonvariável possa ser retornada?

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;
tommi
fonte

Respostas:

780

Você precisa usar esta linha de código para resolver seu problema:

__block Person *aPerson = nil;

Para mais detalhes, consulte este tutorial: Blocos e Variáveis

Devarshi
fonte
101
Observe que __blocké prefixado com dois sublinhados.
Eric Brotto
12
usando __blockmeu erro, mas o valor não está mantendo fora de bloco. Qualquer ajuda aqui
User16119012
7
O bloco é chamado bem depois de onde parece que deveria ser chamado, em outras palavras, os blocos não são executados 'imediatamente'.
Tom Andersen
11
Se os blocos não rodarem RIGHT AWAY, isso não deve ser aceito como resposta, pois isso o torna um grande problema.
Durazno
3
Esta resposta está correta em relação à pergunta postada; sinta-se à vontade para postar outra pergunta se você tiver um cenário diferente em mente.
Devarshi #
40

Apenas um lembrete de um erro que eu cometi também, o

 __block

A declaração deve ser feita ao declarar a variável pela primeira vez, ou seja, FORA do bloco, e não dentro dela. Isso deve resolver os problemas mencionados nos comentários sobre a variável que não mantém seu valor fora do bloco.

Denis Balko
fonte
18

Basta usar o __block prefixo para declarar e atribuir qualquer tipo de variável dentro de um bloco.

Por exemplo:

__block Person *aPerson = nil;

__block NSString *name = nil;
Umesh Sawant
fonte
10

Para atribuir uma variável dentro do bloco que fora do bloco sempre use o especificador __block antes dessa variável, seu código deve ser assim: -

__block Person *aPerson = nil;
Gaurav
fonte
10
__block Person *aPerson = nil;
Ketan Patel
fonte
3

Tente __weakse você receber algum aviso sobre o ciclo de retenção, use__block

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

Agora você pode consultar o weakPersonobjeto dentro do bloco.

PradeepKN
fonte
3

O bloco yes é a funcionalidade mais usada, portanto, para evitar o ciclo de retenção, devemos evitar o uso da variável forte, incluindo o self dentro do bloco, apesar de usar o _weak ou weakself.

user6311313
fonte
0

Quando vi o mesmo erro, tentei resolvê-lo da seguinte maneira:

   __block CGFloat docHeight = 0.0;


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

e está funcionando bem

Basta adicionar " __block " antes de Variable.

Mr.Javed Multani
fonte