Attribuer une variable à l'intérieur d'un bloc à une variable à l'extérieur d'un bloc

382

Je reçois une erreur

La variable n'est pas attribuable (spécificateur de type __block manquant)

sur la ligne aPerson = participant;. Comment puis-je m'assurer que le bloc peut accéder à la aPersonvariable et que la aPersonvariable peut être retourné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;
tommi
la source

Réponses:

780

Vous devez utiliser cette ligne de code pour résoudre votre problème:

__block Person *aPerson = nil;

Pour plus de détails, veuillez vous référer à ce tutoriel: Blocs et Variables

Devarshi
la source
101
Veuillez noter qu'il __blockest préfixé par deux traits de soulignement.
Eric Brotto
12
en utilisant __blockmon erreur disparu, mais la valeur ne retient pas hors du bloc. Toute aide ici
User16119012
7
Le bloc est appelé bien après l'endroit où il semble qu'il devrait être appelé, en d'autres termes, les blocs ne s'exécutent pas «tout de suite».
Tom Andersen
1
Si les blocs ne s'exécutent PAS DROIT, cette réponse ne devrait pas être acceptée car cela en fait un énorme facteur de rupture.
durazno
3
Cette réponse est correcte en ce qui concerne la question publiée, n'hésitez pas à poster une autre question si vous avez un scénario différent en tête.
Devarshi
40

Juste un rappel d'une erreur que je me suis faite moi aussi, le

 __block

doit être effectuée lors de la première déclaration de la variable, c'est-à-dire À L'EXTÉRIEUR du bloc, pas à 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.

Denis Balko
la source
18

Utilisez simplement le __blockpréfixe pour déclarer et affecter tout type de variable à l'intérieur d'un bloc.

Par exemple:

__block Person *aPerson = nil;

__block NSString *name = nil;
Umesh Sawant
la source
10

Pour assigner une variable à l'intérieur d'un bloc qui à l'extérieur du bloc utilise toujours le spécificateur __block avant cette variable, votre code devrait être comme ceci: -

__block Person *aPerson = nil;
Gaurav
la source
10
__block Person *aPerson = nil;
Ketan Patel
la source
3

Essayez __weaksi vous recevez un avertissement concernant le cycle de conservation sinon utilisez__block

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

Vous pouvez maintenant référencer un weakPersonobjet dans un bloc.

PradeepKN
la source
3

oui le bloc est la fonctionnalité la plus utilisée, donc pour éviter le cycle de rétention, nous devons éviter d'utiliser la variable forte, y compris self à l'intérieur du bloc, malgré l'utilisation de _weak ou de faible.

user6311313
la source
0

Quand j'ai vu la même erreur, j'ai essayé de la résoudre comme:

   __block CGFloat docHeight = 0.0;


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

et son bon fonctionnement

Ajoutez simplement " __block " avant la variable.

Mr.Javed Multani
la source