Warum müssen NSBlocks für die Lagerung in Containern kopiert werden?
- (void) addABlock
{
void (^aBlock)(void) = ^() { [someObject doSomething]; };
[self.myMutableArray addObject: aBlock]; // Oops..
[self.myMutableArray addObject: [aBlock copy]]; // works fine
}
Im obigen vereinfachten Beispiel sehe ich undefiniertes Verhalten, wenn das Blockkopieren nicht durchgeführt wird. Dieser Fall wird speziell in der ARC-Übergangsanleitung von Apple aufgeführt.
Der Teil, den ich nicht verstehe, istWarum Ich muss die Kopie manuell aufrufen. Der Block wird auf dem Stapel erstellt, daher muss eine block_copy ausgeführt werden - so viel ist klar. NSArray ruft copy nicht auf, sollte jedoch preserve für Objekte aufrufen, die hinzugefügt werden. Warum ruft [NSBlock behalten] nicht einfach zu [NSBlock kopieren] durch?
http://www.galloway.me.uk/2013/05/a-look-inside-blocks-episode-3-block-copy/