4

Ich bin in der Verwendung von Blöcken in Objective-C und habe nicht wirklich eine gute Erklärung dafür gefunden, warum ein Block, wenn Sie es einer Instanzvariablen zuweisen, mit copy zugewiesen werden muss und nicht assign?Warum muss die Zuweisung eines Objc-Blocks 'kopieren', nicht 'zuweisen' sein?

zum Beispiel:

typedef void (^MyBlock)(); 

@interface SomeClass : NSObject 
{ 
    MyBlock myblock; 
    // Other ivars 
} 

@property (nonatomic, copy) MyBlock myblock; // Why must this be 'copy'??? 

// other declarations 

@end 

Antwort

9

Nun, lassen Sie uns dies analysieren:

Sagen wir, Sie in irgendeiner Methode einen Block erstellen, weisen sie zu einem gewissen Variable:

MyBlock block = ^{}; 

Sie dann einfach zugewiesen zu einer Eigenschaft mit assign:

self.myblock = block; 

Wenn die containing-Methode zurückgegeben wird, wird die block-Variable den Gültigkeitsbereich verlassen und die Zuordnung aufgehoben. In diesem Sinne müssen Sie das Blockobjekt copy und dann in Ihrer Instanzvariablen speichern. Auf diese Weise können Sie den Block für die Lebensdauer des enthaltenen Objekts besitzen.

+8

I.e. Blöcke werden für Geschwindigkeit auf dem Stapel erstellt, und -copy verschiebt sie vom Stapel zum Heap. – bbum

0

es gibt eine gute Erklärung in der wwdc Video "Advanced Objective-C und Garbage Collection" sehenswert, wenn Sie beginnen, in Blöcke zu gehen und wollen einige der Interna erklärt. Es gibt auch einige andere großartige Gespräche dort. Sehr empfehlenswert.

Verwandte Themen