Ссылки блока как экземпляр Вар в Objective C

Я задавался вопросом, возможно ли сохранить ссылку на анонимную функцию (блок) как переменная экземпляра в Objective C.

Я знаю, как использовать делегацию, целевое действие, и т.д. Я не говорю об этом.

44
задан Jacob Relkin 16 September 2011 в 22:42
поделиться

2 ответа

Конечно.

typedef void(^MyCustomBlockType)(void);

@interface MyCustomObject {
  MyCustomBlockType block;
}
@property (nonatomic, copy) MyCustomBlockType block; //note: this has to be copy, not retain
- (void) executeBlock;
@end

@implementation MyCustomObject
@synthesize block;

- (void) executeBlock {
  if (block != nil) {
    block();
  }
}

- (void) dealloc {
  [block release];
  [super dealloc];
}
@end

//elsewhere:

MyCustomObject * object = [[MyCustomObject alloc] init];
[object setBlock:^{
  NSLog(@"hello, world!");
}];

[object executeBlock];
[object release];
86
ответ дан 26 November 2019 в 21:57
поделиться

Да, вы определенно можете хранить ссылку на (копию) блока Objective-C. Объявление переменной немного сложновато, как, например, указатели функций языка C, но это не проблема. Для блока, который принимает и id и возвращает void:

typedef void (^MyActionBlockType)(id);

@interface MyClass : NSObject 
{

}

@property (readwrite,nonatomic,copy) MyActionBlockType myActionBlock;
@end

подойдут.

12
ответ дан 26 November 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: