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 会在当前代码执行退出后被调用。正因为它提供了一种延时调用的方式,所以一般会被用来做资源释放或者销毁,这在某个函数有多个返回出口的时候特别有用。
Objective-C Swift
在OC中也有一个类似的方法:__attribute__((cleanup(...)))
这个方法可以在作用域结束的时候执行指定的方法:
代码语言:javascript复制{
...
NSString *testCleanString __attribute__((cleanup(printTestString))) = @"作用域结束";
}
void printTestString(NSString **string){
NSLog(@" 打印信息string:%@",*string);
}
//输出结果为
打印信息string:作用域结束
可以传递一个block,实现类似Swift中的defer:
代码语言:javascript复制- (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类的一个扩展方法的话则可以这样使用:
代码语言:javascript复制{
[self defer:^{
NSLog(@"作用域结束");
}];
...
...
}
```![066c5c571bd5245b58de320272fa571f.jpg](https://upload-images.jianshu.io/upload_images/2955252-7c9488cfb6e44a8a.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)