Как хранить блоки в свойствах в 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;