【iOS底层原理】block基本认识
您已经看过
[清空]
    fa-home|fa-star-o
    当前位置:网站买卖_私人做网站_网站交易>权重网站>【iOS底层原理】block基本认识

    【iOS底层原理】block基本认识

    权重网站cntkd2022-08-27 23:06450A+A-

    • block 的原理是怎样的?本质是什么?

    block本质上也是一个OC对象,它的内部也有isa指针,它是封装了函数调用(函数调用地址)以及函数调用环境(block执行需要的参数)的OC对象

    block的底层结构解析:

    intage = 10;

    void(^block)(int,int) = ^(inta ,intb){

    NSLog(@"this is a block! -- %d", age);

    NSLog(@"this is a block!");

    NSLog(@"this is a block!");

    NSLog(@"this is a block!");

    };

    对应的底层代码:

    intage = 10;

    // 定义 block 变量

    // block 底层是一个 __main_block_impl_0 的结构体,这个结构体的构造函数接收三个参数

    // __main_block_func_0(block的函数地址)、__main_block_desc_0_DATA(block的相关信息--大小)、age

    // 调用结构体 __main_block_impl_0 的构造函数,这个构造函数接受三个参数并将结构体 __main_block_impl_0 的地址赋值给 block,服务器租用哪里好

    void(*block)(int,int) = ((void(*)(int,int))&__main_block_impl_0((void*)__main_block_func_0, &__main_block_desc_0_DATA, age));

    // block 底层机构体(本质)

    struct__main_block_impl_0 {

    struct__block_impl impl;

    struct__main_block_desc_0* Desc;

    intage;

    // 下面是构造函数(构造函数会返回结构体__main_block_impl_0),接收block传递过来的三个参数,分别block的函数地址、block的相关信息--大小、参数age

    __main_block_impl_0(void*fp,struct__main_block_desc_0 *desc,int_age,intflags=0) : age(_age) {

    // 在构造函数内部,将传过来的函数地址 fp 赋值给 结构体 __block_impl 的 FuncPtr 成员变量,并使结构体 __block_impl 的isa指针指向_NSConcreteStackBlock(block类型)服务器租用哪里好

    impl.isa = &_NSConcreteStackBlock;

    impl.Flags = flags;

    impl.FuncPtr = fp;

    Desc = desc;

    }

    }

    struct__block_impl {

    void*isa;

    intFlags;

    intReserved;

    void*FuncPtr;

    };

    // 所以block的地层结构是一个OC对象,对象里面存储着isa指针和block函数地址

    // 调用 block 拿到 block 的函数指针进行调用

    // __main_block_impl_0 ----> __block_impl ----> FuncPtr

    ((void(*)(__block_impl *,int,int))((__block_impl *)block)->FuncPtr)((__block_impl *)block, 10, 10);

    原理:block 的底层是一个__main_block_impl_0 结构体。

    在定义一个block时,系统会将block代码块封装成函数__main_block_func_0,同时使block指针会指向一个类型为__main_block_impl_0 的结构体(该结构体中包含另一个结构体__block_impl,并将__main_block_func_0的地址赋值给结构体__block_impl的成员变量FuncPtr)服务器租用哪里好调用的时候通过block查找到FuncPtr(block代码块地址)进行调用

    block 变量捕获:为了保证block内部能够正常访问外部的变量,block有个变量捕获机制

    全局变量不需要捕获,直接使用,局部变量如果在block内部需要使用,则block就会捕获,捕获的时候 auto(可以理解为基础类型) 类型的是值传递,static 类型(对象)的是指针传递

    局部变量:

    上面block对应的c++代码,可以看出static修饰的变量是指针传递,基础类型是值传递

    【iOS底层原理】block基本认识》由《网站买卖_私人做网站_网站交易》整理呈现,请在转载分享时带上本文链接,谢谢!

    支持Ctrl+Enter提交
    网站买卖_私人做网站_网站交易 © All Rights Reserved.  Copyright Your WebSite.Some Rights Reserved.
    Powered by 网站交易