2.Blocks

作者: LucXion | 来源:发表于2021-08-18 09:58 被阅读0次

    带有自动变量值的匿名函数

    五种变量:自动变量(局部变量)、函数参数、局部静态变量、全局静态变量、全局变量

    其中能够在多次调用之间能够传递值的是:静态变量(局部、全局)、全局变量

    Blocks的省略方式

    Block省略
        // 通过typedef简化Block类型
        typedef int(^Block)(int);
        Block b = ^(int a){
            return a + 1;
        };
    

    Blocks的实现

    将代码转化为普通的C函数代码来实现,核心是objc_msgSend函数,从对象持有类的结构体中,检索函数的指针并调用。Block即为Objective-C对象。

    Blocks 截获自动变量的值

    将自动变量保存到block结构体实例中

        int num = 10;
        void(^block)(void) = ^(){
            // 截获所使用的自动变量的瞬间值
            printf("inside num = %d\n",num);
        };
        num = 5;
        block();
        printf("outside num = %d\n",num);
    

    __block (存储域类)说明符:修饰自动变量,使自动变量能在block内赋值。底层会生成一个 __block的结构体

        __block int num = 10;
        void(^block)(void) = ^(){
            // 只有执行block才会修改赋值
            num = 11;
        };
        printf("1: %d\n",num); 
        num = 5;
        printf("2: %d\n",num);
        block();
        printf("3: %d\n",num);
    

    Blocks使用静态变量

    将静态变量指针static_val传递给结构体__main_block_imp1_0的构造函数并保存。

    什么时候Block会从栈复制到堆

    • 调用copy方法

    • block作为函数返回值

    • block赋值给__strong修饰符id类型的类或者Block类型成员变量

    • 方法名中含有UsingBlock的Cocoa框架方法,或GCD中传递的block

    如何避免Block的循环引用

    __weak , 也可以使用__block, __block的优点就是可以控制释放,当不需要的时候只需要 = nil就能释放,缺点就是必须要执行block体,否则对象不会被释放

    相关文章

      网友评论

          本文标题:2.Blocks

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