Блокировать ссылки как экземпляры vars в Objective-C Мне было интересно, можно ли сохранить ссылку на анонимную функцию (блок) в качестве переменной экземпляра в Objective-C. Я знаю, как использовать делегирование, целевое действие и т.д. Я не говорю об этом. Ответ 1 Конечно. 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]; Ответ 2 Да, вы, безусловно, можете сохранить ссылку на (копию) блока Objective-C. Объявление переменной немного волосатое, например, указатели функций C, но помимо этого это не проблема. Для блока, который принимает и id, и возвращает void: typedef void (^MyActionBlockType)(id); @interface MyClass : NSObject { } @property (readwrite,nonatomic,copy) MyActionBlockType myActionBlock; @end сделает трюк.
Ответ 1 Конечно. 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];
Ответ 2 Да, вы, безусловно, можете сохранить ссылку на (копию) блока Objective-C. Объявление переменной немного волосатое, например, указатели функций C, но помимо этого это не проблема. Для блока, который принимает и id, и возвращает void: typedef void (^MyActionBlockType)(id); @interface MyClass : NSObject { } @property (readwrite,nonatomic,copy) MyActionBlockType myActionBlock; @end сделает трюк.