Je reçois une erreur
La variable n'est pas assignable (spécificateur de type __block manquant)
sur la ligne aPerson = participant;
. Comment puis-je m'assurer que le bloc peut accéder à la variable aPerson
et que la variable aPerson
peut être renvoyée?
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;
Vous devez utiliser cette ligne de code pour résoudre votre problème:
__block Person *aPerson = nil;
Pour plus de détails, référez-vous à ce tutoriel: Blocs et Variables
Juste un rappel d’une erreur que j’ai moi-même faite, le
__block
la déclaration doit être effectuée lors de la première déclaration de la variable, c'est-à-dire OUTSIDE du bloc et non à l'intérieur de celui-ci. Cela devrait résoudre les problèmes mentionnés dans les commentaires sur la variable ne conservant pas sa valeur en dehors du bloc.
Utilisez simplement le préfixe __block
pour déclarer et affecter tout type de variable dans un bloc.
Par exemple:
__block Person *aPerson = nil;
__block NSString *name = nil;
__block Person *aPerson = nil;
Pour affecter une variable à l'intérieur d'un bloc qui, en dehors de celui-ci, utilisez toujours le spécificateur __block avant cette variable, votre code devrait ressembler à ceci: -
__block Person *aPerson = nil;
Essayez __weak
si vous recevez un avertissement concernant le cycle de conservation, sinon utilisez __block
Person *strongPerson = [Person new];
__weak Person *weakPerson = person;
Vous pouvez maintenant vous référer à weakPerson
objet dans le bloc.
yes block sont les fonctionnalités les plus utilisées. Par conséquent, afin d'éviter le cycle de conservation, nous devons éviter d'utiliser la variable strong, y compris self à l'intérieur du bloc, mais utilisez plutôt _weak ou faible.