专栏首页韦弦的偶尔分享Objective-C中实现Swift中的defer

Objective-C中实现Swift中的defer

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(@"作用域结束");
    }];
  ...
  ...
}
```![066c5c571bd5245b58de320272fa571f.jpg](https://upload-images.jianshu.io/upload_images/2955252-7c9488cfb6e44a8a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Swift 数数并说 - LeetCode

    1 被读作 "one 1" ("一个一") , 即 11。 11 被读作 "two 1s" ("两个一"), 即 21。 21 被读作 "one 2",...

    韦弦zhy
  • 微信小程序分享图片的简易canvas工具类

    如有需要请自取:GitHub微信小程序保存图片分享的 canvas 简易自用工具类

    韦弦zhy
  • Swift:轻量级API的设计(二)

    Swift的最强大功能之一就是在设计API方面给我们提供了极大的灵活性。这种灵活性不仅使我们能够定义易于理解和使用的函数和类型,还使我们能够创建给人以非常轻量级...

    韦弦zhy
  • 看完你就明白的锁系列之锁的公平性

    我们知道,在并发环境中,多个线程需要对同一资源进行访问,同一时刻只能有一个线程能够获取到锁并进行资源访问,那么剩下的这些线程怎么办呢?这就好比食堂排队打饭的模型...

    cxuan
  • Linux 下卸载MySQL Enterprise Monitor

        MySQL Enterprise Monitor是专门为MySQL数据库而设计的一款企业级监控,能非常好地与MySQL各方面特性相结合,包括:MySQ...

    Leshami
  • pytorch学习笔记(三):自动求导

    auto gradient 本片博文主要是对http://pytorch.org/docs/notes/autograd.html的部分翻译以及自己的理解,如有...

    ke1th
  • tf.random_uniform()

    从均匀分布中输出随机值。生成的值在该 [minval, maxval) 范围内遵循均匀分布.下限 minval 包含在范围内,而上限 maxval 被排除在外。...

    于小勇
  • 【RL-TCPnet网络教程】第3章 初学RL-TCPnet的准备工作及其快速上手

    俗话说万事开头难,学习一门新的知识,难的往往不是知识本身,而是如何快速上手,需要什么资料和开发环境。一旦上手后,深入的学习就相对容易些了。

    armfly
  • BaseFragment 延迟加载lazyload

    注意1:在某些时候setContentView(V)可能会引发null 异常就需要调用setContentView(V,T)

    用户4458175
  • EmguCV学习——视频与图片互转

    其实视频转图片在上篇文章中已经有些眉目了,其实就是按帧读取视频,然后把帧保存就ok。然后自己再加个进度条美化一下。。。这代码简单易懂,还是直接上代码吧。

    叁金

扫码关注云+社区

领取腾讯云代金券