Asignar una variable dentro de un bloque a una variable fuera de un bloque


382

Me sale un error

La variable no es asignable (falta el especificador de tipo de bloque __)

en la linea aPerson = participant;. ¿Cómo puedo asegurarme de que el bloque pueda acceder a la aPersonvariable y que la aPersonvariable pueda ser devuelta?

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;

Respuestas:


780

Debe usar esta línea de código para resolver su problema:

__block Person *aPerson = nil;

Para obtener más detalles, consulte este tutorial: bloques y variables


101
Tenga en cuenta que __blocktiene el prefijo dos guiones bajos.
Eric Brotto

12
usando __blockmi error desaparecido, pero el valor no se retiene fuera del bloque. Cualquier ayuda aquí
Usuario16119012

77
El bloque se llama mucho después de donde parece que debería llamarse, en otras palabras, los bloques no se ejecutan 'de inmediato'.
Tom Andersen

1
Si los bloques no se ejecutan INMEDIATAMENTE, esta respuesta no debe aceptarse, ya que eso es un factor decisivo.
durazno

3
Esta respuesta es correcta con respecto a la pregunta publicada, no dude en publicar otra pregunta si tiene un escenario diferente en mente.
Devarshi

40

Solo un recordatorio de un error que cometí yo también, el

 __block

La declaración debe hacerse cuando se declara por primera vez la variable, es decir, FUERA del bloque, no dentro de él. Esto debería resolver los problemas mencionados en los comentarios sobre la variable que no retiene su valor fuera del bloque.


18

Simplemente use el __blockprefijo para declarar y asignar cualquier tipo de variable dentro de un bloque.

Por ejemplo:

__block Person *aPerson = nil;

__block NSString *name = nil;

10

Para asignar una variable dentro del bloque que fuera del bloque siempre use el especificador __block antes de esa variable, su código debería ser así:

__block Person *aPerson = nil;


3

Pruebe __weaksi recibe alguna advertencia sobre el ciclo de retención; de lo contrario, use__block

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

Ahora puedes referir weakPersonobjetos dentro del bloque.


3

sí, el bloque es la funcionalidad más utilizada, por lo tanto, para evitar el ciclo de retención, debemos evitar usar la variable fuerte, incluido self dentro del bloque, inspirar usar _weak o weakself.


0

Cuando vi el mismo error, traté de resolverlo como:

   __block CGFloat docHeight = 0.0;


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

y está funcionando bien

Simplemente agregue " __block " antes de Variable.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.