wake-up-neo.com

Speichern von Blöcken in Eigenschaften in Objective-C

Ich möchte den Objective-C-Block für eine spätere 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 dachte, dass es sich lohnen könnte, sie für andere Neulinge wie mich zu teilen.

Anfangs dachte ich, dass ich die Eigenschaften von Hand schreiben müsste, um Block_copy & Block_release zu verwenden.

Glücklicherweise habe ich herausgefunden, dass Blöcke sind NSObjects und - copy/- releaseBlock_copy/Block_release Entspricht. So kann ich @property (copy) verwenden, um Setter & Getter automatisch zu generieren.

76
Piotr Czapla

Edit: 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();
135
Dave DeLong

Alternativ ohne die typedef

@property (copy, nonatomic) void (^selectionHandler) (NSDictionary*) ;

98
Steven Kramer

Eine sehr gute Erklärung hierzu finden Sie in der WWDC 2012-Sitzung 712 ab Seite 83. Die korrekte Methode zum Speichern eines Blocks unter ARC lautet wie folgt:

@property(strong) my_block_type work;

Seien Sie vorsichtig mit den Retain-Zyklen. Eine gute Möglichkeit zum Lösen besteht darin, den Block auf Null zu setzen, wenn Sie ihn nicht mehr benötigen:

self.work = nil;
9
Jorge Perez