Elle indique au compilateur que toute variable marquée par elle doit être traitée d'une manière spéciale lorsqu'elle est utilisée à l'intérieur d'un bloc. Normalement, les variables et leur contenu qui sont également utilisés dans des blocs sont copiés, donc toute modification apportée à ces variables n'apparaît pas en dehors du bloc. Lorsqu'elles sont marquées par __block
les modifications effectuées à l'intérieur du bloc sont également visibles à l'extérieur de celui-ci.
Pour un exemple et de plus amples informations, voir Le type de stockage __block dans le site d'Apple Blocs Sujets de programmation .
L'exemple important est celui-ci :
extern NSInteger CounterGlobal;
static NSInteger CounterStatic;
{
NSInteger localCounter = 42;
__block char localCharacter;
void (^aBlock)(void) = ^(void) {
++CounterGlobal;
++CounterStatic;
CounterGlobal = localCounter; // localCounter fixed at block creation
localCharacter = 'a'; // sets localCharacter in enclosing scope
};
++localCounter; // unseen by the block
localCharacter = 'b';
aBlock(); // execute the block
// localCharacter now 'a'
}
Dans cet exemple, les deux localCounter
y localCharacter
sont modifiés avant que le bloc ne soit appelé. Cependant, à l'intérieur du bloc, seule la modification de l'élément localCharacter
serait visible, grâce à la __block
mot-clé. Inversement, le bloc peut modifier localCharacter
et cette modification est visible en dehors du bloc.
3 votes
Vérifier aquí et la section "Blocs et variables".
1 votes
Duplicata possible de Syntaxe des blocs en Objective-C - quelqu'un peut-il l'expliquer ?
0 votes
@Vincent ack, merci j'avais oublié cette section ! Je vais y jeter un coup d'oeil.
1 votes
@Code Monkey : Je demandais spécifiquement le mot-clé, pas la syntaxe en général. Je ne pense donc pas qu'il s'agisse vraiment d'un doublon.
3 votes
@Code Monkey : Non, il ne s'agit pas d'un doublon. La question que vous mentionnez ne parle pas de
__block
du tout.3 votes
Et si quelqu'un se demande comment l'Objective-C
__block
devrait se traduire en Swift : " Les fermetures [en Swift] ont une sémantique de capture similaire à celle des blocs [en Objective-C], mais diffèrent sur un point essentiel : Les variables sont mutables plutôt que copiées. En d'autres termes, le comportement de __block en Objective-C est le comportement par défaut des variables en Swift. " Du livre d'Apple : Using Swift with Cocoa and Objective-C (Swift 2.2).