Ich bin vertraut mit der __block
-Anweisung, die die Variable 'zuweisbar' innerhalb eines Blocks macht. Aber ich sehe, dass wenn einige Objective-C-Features, die Blöcke als Argumente in Methoden verwenden, einige Variablen zuweisbar sind, auch wenn sie nicht mit dieser __block
-Anweisung deklariert sind.iOS >> Blöcke >> Ändern der Werte von Variablen außerhalb des Blocks
Hier sind 2 Codes zum Beispiel:
[UIView animateWithDuration:2 animations:^
{
self.animatedView.backgroundColor = [UIColor blueColor];
self.animatedView.center = CGPointMake(100, 100);
}];
(animatedView ist ein einfaches UIView mit einem IBOutlet angeschlossen).
int myInt = 10;
NSMutableString* mString = [NSMutableString stringWithString:@"Mutable Hello"];
NSString* imString = @"Imutable Hello";
void (^myBlock)(void) =^
{
[mString appendString:@" Block"]; //working
imString = @"Imutable Hello Block"; //error
myInt = 11; //error
};
Meine Frage ist: Wie komme ich Werte auf die UIView Instanzeigenschaften zuweisen können?
Ich adressiere kein Objekt und ändere es, wie mein mString.
Ich würde erwarten, dass die Eigenschaft 'center' sich wie myInt verhält, da es sich um eine C-Struktur handelt, auf die direkt zugegriffen wird, und nicht um einen Zeiger auf ein Objekt.
Ich würde 'backgroundColor' erwarten, sich wie mein imString zu verhalten, da es ein Zeiger auf ein Objekt ist, das mit einem neuen Objekt zugewiesen wird, oder?
Ich konnte keine befriedigende Erklärung in der Dokumentation finden ... Ich würde mich freuen, wenn jemand einen liefern kann, oder mich zu einem ansprechen.
So ist die Tatsache, dass die oder ‚CGPoint Zentrum‘ ‚Bool versteckt‘ halten ivars hinter ihnen macht keinen Unterschied? Bedeutet das, dass, da sie Eigenschaften sind (auf die über eine Setter-Methode zugegriffen wird), die Art und Weise geändert wird, in der sie im Speicher zugewiesen werden? Ich habe es auch mit einem in meiner Klasse deklarierten Ivar versucht (und keine lokale Variable in der Methode), und es hat auch funktioniert - und es geht keine Methode durch. –
Die Methode ist ein Nebeneffekt (mangels eines besseren Begriffs). Der Unterschied ist der Speicherort. Lokale Variablen werden auf dem Stapel erstellt. Wenn Sie dem Compiler also nicht mitteilen, dass sie auf den Heap kopiert werden sollen, sind sie nicht zugänglich. Der Compiler verwendet auch eine Reihe von "Tricks", wenn Daten innerhalb des Blocks verfügbar gemacht werden (und die Route ist unterschiedlich zwischen Zeigern und Primitiven). Es ist ein tiefgründiges Thema, lesen Sie diesen Thread: http://StackOverflow.com/Questions/15082265/Why-Isa-Block-Variable-Ismoved-to-the-Heap-before-the- Block-ist-kopiert – Wain
Got it. Wain, du bist der Mann! Vielen Dank. –