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