Как хранить блоки в свойствах в Objective-C? - PullRequest
76 голосов
/ 02 ноября 2010

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

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

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

Ответы [ 3 ]

135 голосов
/ 02 ноября 2010

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

Альтернативно, без определения типа

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

9 голосов
/ 02 августа 2012

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

@property(strong) my_block_type work;

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

self.work = nil;
...