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://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

http://www.galloway.me.uk/2013/05/a-look-inside-blocks-episode-3-block-copy/

Antworten auf die Frage(2)

Ihre Antwort auf die Frage