Как хранить блоки в свойствах в Objective-C?

Я хотел бы сохранить блок objective-c в свойстве для последующего использования. Я не был уверен, как это сделать, поэтому я немного поработал с поиском и немного информации о предмете. Но мне удалось найти решение в конце концов, и я подумал, что это может быть полезно для других новичков, подобных мне.

Первоначально я думал, что мне нужно будет вручную написать свойства, чтобы использовать Block_copy и Block_release.

К счастью, я обнаружил, что блоки являются NSObjects, а - copy/- release эквивалентно Block_copy/Block_release, Поэтому я могу использовать @property (copy) для автоматического создания сеттеров и геттеров.

Ответ 1

Изменить: обновлено для 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();

Ответ 2

В качестве альтернативы без typedef

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

Ответ 3

Вы можете найти очень хорошее объяснение этого в сессии 712 WWDC 2012, начиная со страницы 83. Правильный способ сохранения блока в ARC заключается в следующем:

@property(strong) my_block_type work;

Будьте осторожны с циклами сохранения. Хороший способ решить - установить блок на нуль, когда он вам больше не понадобится:

self.work = nil;