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.