ich froh sein würde Erklärung für das folgende Verhalten zu erhalten:A Tricky Objective-C-Blöcke Verhalten
typedef void (^MyBlock)(void);
MyBlock g_ary[4];
int runBlockParam2(MyBlock callbackBlock, int num) {
g_ary[num] = callbackBlock;
return num+100;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int i;
for (i=0; i<4; i++) {
__block int j;
int k = runBlockParam2(^{
NSLog(@"in the block i=%i, j=%i", i, j);
}, i);
j=k;
}
for (i=0; i<4; i++) {
g_ary[i]();
}
}
return 0;
}
Der obige Code zeigt die folgende Ausgabe: in the block i=0, j=100 in the block i=1, j=101 in the block i=2, j=102 in the block i=3, j=103
Warum j
durch die modifiziert Zuordnung, die dem Block folgt?
Es ist interessant zu erwähnen, dass, wenn wir den __block
Modifikator entfernen, werden wir diese: in the block i=0, j=0 in the block i=1, j=100 in the block i=2, j=101 in the block i=3, j=102
Ich werde eine Erklärung auf das oben beschriebene Verhalten schätzen!
Vielen Dank für die Antwort. Aber 'j 'geht in den nächsten Zyklen weiter, also warum werden sie nicht alle 103, als der letzte Wert, der' j 'zugewiesen wird, bevor der Gültigkeitsbereich der' j'-Variable verlassen wird? – ishahak
Sie deklarieren 'j' innerhalb der Schleife, so dass jeder Block sein eigenes' j' hat, auf das es sich bezieht. Wenn Sie den '__block int j;' außerhalb der Schleife verschieben, werden alle Blöcke 'j = 103' ausgeben. – dan
Danke @dan. Ich werde deine Antwort akzeptieren. Das bedeutet, dass eine Variable '__block' eigentlich eine statische Variable innerhalb des Blocks ist, aber solange der Umfang ihrer Deklaration existiert, kann sie außerhalb des Blocks aufgerufen werden! – ishahak