Ich möchte den Objective-C-Block zur späteren Verwendung in einer Eigenschaft speichern. Ich war mir nicht sicher, wie ich es machen sollte, also habe ich ein bisschen gegoogelt und es gibt nur sehr wenige Informationen zu diesem Thema. Aber ich habe es schließlich geschafft, die Lösung zu finden, und ich dachte, dass es sich lohnen könnte, sie für andere Neulinge wie mich zu teilen.
Anfangs dachte ich, ich müsste die Eigenschaften von Hand schreiben, um Block_copy & Block_release zu verwenden.
Zum Glück habe ich herausgefunden, dass Blöcke sind NSObjects und - copy
/ - release
entspricht Block_copy
/ Block_release
. So kann ich @property (copy)
Setter & Getter automatisch generieren.
objective-c
objective-c-blocks
Piotr Czapla
quelle
quelle
Antworten:
Bearbeiten: aktualisiert für ARC
typedef void(^MyCustomBlock)(void); @interface MyClass : NSObject @property (nonatomic, copy) MyCustomBlock customBlock; @end @implementation MyClass @end MyClass * c = [[MyClass alloc] init]; c.customBlock = ^{ NSLog(@"hello....."); } c.customBlock();
quelle
nonatomic
überall. Es sollte Standard IMO gewesen sein.atomic
sorgt für eine größere Binärleistung, eine geringere Leistung (Sperren für alle Accessoren) und scheint Thread-Sicherheit zu versprechen - wenn dies normalerweise auf einer höheren Ebene als bei Eigenschafts-Accessoren gelöst werden muss.Alternativ ohne typedef
@property (copy, nonatomic) void (^selectionHandler) (NSDictionary*) ;
quelle
Eine sehr gute Erklärung hierfür finden Sie in der WWDC 2012-Sitzung 712 ab Seite 83. Die richtige Methode zum Speichern eines Blocks unter ARC ist die folgende:
@property(strong) my_block_type work;
Seien Sie vorsichtig mit den Haltezyklen. Eine gute Lösung besteht darin, den Block auf Null zu setzen, wenn Sie ihn nicht mehr benötigen:
self.work = nil;
quelle
copy
korrekt sowohl unter MRC als auch unter ARC