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;

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


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.


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;

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;


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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.