今天我读到了Go语言中的
defer
语句:
defer语句会将一个函数调用推入列表中。保存的调用列表会在包含函数返回后被执行。通常使用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"));
…
}
Autoreleased对象似乎是唯一的解决方案,可以持续到函数的末尾,因为其他解决方案会在当前作用域结束时触发。另一方面,它们可能会停留在内存中更长时间,这可能会带来麻烦。
调度finalizer是我首先想到的,因为块位于堆栈上,因此当堆栈取消时,我可以轻松地执行某些操作。但是在查看文档后,似乎我不能将简单的“析构函数”函数附加到一个块上,对吗?
C++析构函数大致相同,我会创建一个基于堆栈的对象,并使用一个块来在析构函数运行时执行。这将有一个丑陋的缺点,即将普通的.m
文件转换为Objective-C++?
我并不真的考虑在生产中使用这些东西,我只是对各种解决方案感兴趣。你能想出一些工作的方法,没有明显的缺点吗?基于作用域和基于函数的解决方案都很有趣。