今天看啥  ›  专栏  ›  韦弦Zhy

Objective-C中实现Swift中的defer

韦弦Zhy  · 简书  ·  · 2019-12-25 10:30

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(...)))

这个方法可以在作用域结束的时候执行指定的方法:

{
    ...
    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(@"作用域结束");
    }];
  ...
  ...
}



原文地址:访问原文地址
快照地址: 访问文章快照