Objective-C中实现Swift中的defer

2019-12-26 17:52:14 浏览数 (1)

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)

0 人点赞