理解ReactiveCocoa的@onExit宏

作者: 子达如何 | 来源:发表于2017-05-11 15:19 被阅读68次

onExit的用法是这样的:

- (void)exitTest {
    @onExit {
        NSLog(@"1");
    };
    {
        @onExit {
            NSLog(@"2");
        };
        
        {
            @onExit {
                NSLog(@"3");
            };
        }
    }
    @onExit {
        NSLog(@"4");
    };
}

就是和Swift的defer用法一样,在离开作用域的时候执行大括号里的代码。注意,同一个作用域下,后定义的@onExit先执行。
具体的定义如下:

#define onExit \
    rac_keywordify \
    __strong rac_cleanupBlock_t metamacro_concat(rac_exitBlock_, __LINE__) __attribute__((cleanup(rac_executeCleanupBlock), unused)) = ^

整体的宏结构和我们熟悉的@weakify,@strongify是一致的。
对于

    @onExit {
        NSLog(@"1");
    };

宏展开之后就是:


        __strong rac_cleanupBlock_t rac_exitBlock_xxxx __attribute__((cleanup(rac_executeCleanupBlock), unused)) = ^ {
            NSLog(@"1");
        };

其中rac_exitBlock_xxxx中的xxxx部分是当前的行号。
这句话的意思就是定义了一个叫rac_exitBlock_xxxx的变量,它是一个block,block的内容就是我们写的代码块了。
这里的关键是一个Clang编译器的修饰符attribute((cleanup(function)))。这个修饰符的作用是:被修饰变量在离开作用域的时候,执行其中指定的function,执行function的时候会把被修饰的变量的指针作为function的参数传递过去。
这样解析可能还是懵懵懂懂的。
看看具体的细节吧

typedef void (^rac_cleanupBlock_t)();

static inline void rac_executeCleanupBlock (__strong rac_cleanupBlock_t *block) {
    (*block)();
}

ReactiveCocoa使用attribute((cleanup(function)))这个修饰符的时候,给的function是rac_executeCleanupBlock,这个function的就是执行传进来的这个block。
( ⊙ o ⊙ )啊!传进来的这个block不就正式我们写的代码块了嘛!
于是,这个特性的作用就是:在作用域结束的时候调用我们的代码块!

相关文章

  • 理解ReactiveCocoa的@onExit宏

    onExit的用法是这样的: 就是和Swift的defer用法一样,在离开作用域的时候执行大括号里的代码。注意,同...

  • ReactiveCocoa 源码分析 - 收藏集 - 掘金

    ReactiveCocoa 中 奇妙无比的 “宏” 魔法 - 掘金 前言 在ReactiveCocoa 中,开源库...

  • ReactiveCocoa中的宏1

    1、onExit onExit的使用 用attribute((cleanup(...)))修饰了rac_clean...

  • @onExit

    @onExit 在工程里可以看到有两处使用@onExit的地方例如上面示例,那么这个onExit的作用是什么,原理...

  • 宏的理解

    一、在宏里面,各种符号的意义: 二、举例学习:ReactiveCocoa中的metamacro_argcount宏...

  • iOS 黑魔法 __attribute__((cleanup))

    SD onExit 宏分析 在读 SDWebimage 源码的时候,发现有这么一个骚操作 然后就来看看 OnExi...

  • ReactiveCocoa常见宏

    1、RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于给某个对象的某个属性绑定。 // ...

  • ReactiveCocoa中的宏

    weakify 源码: 使用方法: 这里有两个问题: autoreleasepool的作用是什么? metamac...

  • ReactiveCocoa理解

    简言 最近要将项目从 MVC 到 MVVM 迁移做组件化开发,经过查阅资料发现 ReactiveCocoa为事件提...

  • ReactiveCocoa用法帮助

    ReactiveCocoa框架概览 网上有个说法对有个ReactiveCocoa很好的理解: 可以把信号想象成水龙...

网友评论

    本文标题:理解ReactiveCocoa的@onExit宏

    本文链接:https://www.haomeiwen.com/subject/iamotxtx.html