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;

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


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.


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;

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;


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.


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.