Swift中有一个defer
A defer statement is used for executing code just before transferring program control outside of the scope that the defer statement appears in.
defer 所声明的 block 会在当前代码执行退出后被调用。正因为它提供了一种延时调用的方式,所以一般会被用来做资源释放或者销毁,这在某个函数有多个返回出口的时候特别有用。
在OC中也有一个类似的方法:__attribute__((cleanup(...)))
这个方法可以在作用域结束的时候执行指定的方法:
{
...
NSString *testCleanString __attribute__((cleanup(printTestString))) = @"作用域结束";
}
void printTestString(NSString **string){
NSLog(@" 打印信息string:%@",*string);
}
//输出结果为
打印信息string:作用域结束
可以传递一个block,实现类似Swift中的defer:
- (void)defer:(void (^)(void))block {
__strong void(^deferBlock)(void) __attribute__((cleanup(blockCleanUp), unused)) = block;
}
static void blockCleanUp(__strong void(^*deferBlock)(void)) {
if (*deferBlock) {
(*deferBlock)();
}
}
将其设置为NSObject类的一个扩展方法的话则可以这样使用:
{
[self defer:^{
NSLog(@"作用域结束");
}];
...
...
}
赏我一个赞吧~~~