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


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

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

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

3 74

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. Правильный способ сохранения блока под дугой заключается в следующем:

@property(strong) my_block_type work;

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

self.work = nil;