Es wird in Apfels Dokumente gesagt: Ein Block-Literal (das heißt,^{...}) ist die Adresse von a Stapel-lokale Datenstruktur, die den Block darstellt. Der Umfang der Stapel lokale Datenstruktur ist daher die umschließenden zusammengesetzte Anweisung, so dass Sie die Muster in den folgenden Beispielen gezeigt vermeiden sollten:Ich weiß nicht, welche Muster von Block ich für den Literalbereich in objective-c vermeiden sollte
void dontDoThis() {
void (^blockArray[3])(void); // an array of 3 block references
for (int i = 0; i < 3; ++i) {
blockArray[i] = ^{ printf("hello, %d\n", i); };
// WRONG: The block literal scope is the "for" loop.
}
//for example I invoke the block here
blockArray[1]();
}
void dontDoThisEither() {
void (^block)(void);
int i = random():
if (i > 1000) {
block = ^{ printf("got i at: %d\n", i); };
// WRONG: The block literal scope is the "then" clause.
}
// ...
}
Ich weiß nicht, welche Muster soll ich vermeiden. Es scheint so, als könnte ich den Block aufrufen, bei dem derselbe Literalbereich wie die Blockdefinition ist, zum Beispiel hinter der "if" - oder "for" -Anweisung. Könnten Sie mir bitte helfen, es zu erklären?
Hier ist es der Link https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Blocks/Articles/bxUsing.html#//apple_ref/doc/uid/TP40007502-CH5-SW1
Vielen Dank. Und heißt das, dass der Block als eine kopierte Eigenschaft deklariert werden sollte, anstatt als Stapelvariable in method? –
oder kann ich einen Block als globale Variable deklarieren? Eigentlich sollte es auch im Local-Stack gespeichert sein, überall zu sehen. –
Verstanden! Vielen Dank. Die Blockverbindungsanweisung mag einen ganzzahligen Wert im Wesentlichen als die Adresse einer stack-local-Datenstruktur. –