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

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

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

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

3 ответа

Решение

Редактировать: обновлено для 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();

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

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

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

@property(strong) my_block_type work;

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

self.work = nil;
Другие вопросы по тегам