Сегодня я прочитал о выражении defer
на языке Go:
A defer оператор выдвигает функцию
позвонить в список. Список сохраненных
вызовы выполняются после
окружающая функция возвращается. Отложить
обычно используется для упрощения функций
которые выполняют различные действия по очистке.
Я подумал, что было бы интересно реализовать что-то подобное в Objective-C. У вас есть идея, как это сделать? Я думал о финализаторах отправки, автоматически выпущенных объектах и деструкторах C ++.
Авто-выпущенные объекты:
@interface Defer : NSObject {}
+ (id) withCode: (dispatch_block_t) block;
@end
@implementation Defer
- (void) dealloc {
block();
[super dealloc];
}
@end
#define defer(__x) [Defer withCode:^{__x}]
- (void) function
{
defer(NSLog(@"Done"));
…
}
Объекты с автоматическим выпуском выглядят как единственное решение, которое будет действовать как минимум до конца функции, поскольку другие решения будут срабатывать при завершении текущей области действия. С другой стороны, они могли бы оставаться в памяти гораздо дольше, что вызвало бы неприятности.
Финализаторы отправки были моей первой мыслью, потому что блоки живут в стеке, и поэтому я мог легко заставить что-то выполнить, когда стек разворачивается. Но после просмотра документации не похоже, что я могу прикрепить простую функцию «деструктор» к блоку, не так ли?
Деструкторы C ++ - это примерно то же самое, я бы создал стековый объект с блоком, который будет выполняться при запуске деструктора. Это может иметь неприятный недостаток - превращать простые .m
файлы в Objective-C ++?
Я действительно не думаю об использовании этого материала в производстве, я просто интересуюсь различными решениями. Можете ли вы придумать что-нибудь работающее, без явных недостатков? Было бы интересно найти решения как на основе области применения, так и на основе функций.