objective-c compiler-errors objective-c-blocks

objective c - Asignar una variable dentro de un bloque a una variable fuera de un bloque



objective-c compiler-errors (7)

Estoy recibiendo un error

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

en la línea aPerson = participant; . ¿Cómo puedo asegurarme de que el bloque pueda acceder a la variable aPerson y que se pueda devolver la variable 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;


Necesita 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


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

__block Person *aPerson = nil;


Pruebe __weak si recibe alguna advertencia con respecto al ciclo de retención o utilice __block

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

Ahora puedes weakPerson objeto weakPerson dentro del bloque.


Sólo un recordatorio de un error que yo mismo hice, el

__block

La declaración debe hacerse al declarar por primera vez la variable, es decir, FUERA del bloque, no dentro de ella. Esto debería resolver los problemas mencionados en los comentarios sobre la variable que no conserva su valor fuera del bloque.


Si el bloque es la funcionalidad más utilizada, por lo tanto, para evitar el ciclo de retención, debemos evitar el uso de la variable fuerte, incluido el yo dentro del bloque, por ejemplo, utilizar el _weak o weakself.


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

Por ejemplo:

__block Person *aPerson = nil; __block NSString *name = nil;


__block Person *aPerson = nil;