美文网首页
Block-类型

Block-类型

作者: 越天高 | 来源:发表于2020-10-23 09:23 被阅读0次

类型01

block有3种类型,可以通过调用class方法或者isa指针查看具体类型,最终都是继承自NSBlock类型
计算block是对象类,那么他就有这么几个特征
1,使用class查看他的具体特征

void (^block)(void)=^{
            NSLog(@"111");

        };
        
        int age = 10;
        void (^block1)(void)=^{
            NSLog(@"%i", age);

        };
        
        NSLog(@"%@-%@-%@", [block class],[block1 class],[^{
            NSLog(@"%i", age);

        } class]);
// __NSGlobalBlock__-__NSMallocBlock__-__NSStackBlock__

但是编译完毕之后,他们最终都变成了isa指向的是以个NSConCreteStackBlock,为什么跟最终的c++不一样 ,我们一切以运行时为准。clang生成的代码,并不一定是我们真正转成的代码,llvm编译器,他会生成一种中间文件。cpp只能用来作为参考

  __NSGlobalBlock__ ( _NSConcreteGlobalBlock )
        __NSStackBlock__ ( _NSConcreteStackBlock )
        __NSMallocBlock__ ( _NSConcreteMallocBlock )

这三种类型的block在内存的布局


block在内存中的布局

程序区:代码段,用来存放代码
数据区:全局变量
堆:我们alloc出来的那些对象,动态分配内存,需要我们自己申请,管理内存
栈:局部变量,系统自己分配,管理内存,

类型02

block是怎么划分类型的

 //__NSGlobalBlock__:没有访问局部auto变量
        //他调用了copy依然还是global
        void (^block)(void)=^{
            NSLog(@"111");

        };
        
        int age = 10;
        //__NSMallocBlock__ :访问局部auto变量(arc),因为ARC帮我们做了很多事情
        //copy只会引用+1;
        //mrc __NSStackBlock__ 放到栈上面之后,会存在问题,因为内存是系统自动管理的,所以有可能我们访问的俄时候变量已经销毁了
        //再去那个地址取值,就有可能是乱值。
        //把它放到堆里面就可以保证他不自动销毁
        //如果__NSStackBlock__执行了copy之后,他就会放到堆上面,就不会被销毁,捕获的值还是刚刚捕获的值
        void (^block1)(void)=^{
            NSLog(@"%i", age);

        };
        
        NSLog(@"%@-%@-%@", [block class],[block1 class],[^{
            NSLog(@"%i", age);

        } class]);

答疑问

function指向的函数房贷代码区
宏不是全局变量,只是替换

通知是一对多,代理一对一,block跟代理很像

类对象是放在 数据段的

相关文章

  • block-类型

    从《block-底层数据结构》中,我们知道block的本质就是就是OC对象,他也有isa指针,它既然是对象,那它是...

  • Block-类型

    类型01 block有3种类型,可以通过调用class方法或者isa指针查看具体类型,最终都是继承自NSBlock...

  • block-对象类型的auto变量

    从上些章节block-变量的捕获(caputer)中,详细说了基本类型的auto变量的捕获,现在来了解下,对象类型...

  • block-整理中

    block-整理中

  • Block-对象类型的auto变量

    01 ARC中对象变量在执行完作用域之后并没有被销毁,因为他会有一个强指针指向了原来那个对象,如果我们访问使用下面...

  • Block

    block- 三种block__NSGlobalBlock__ NSStackBlock __NSMal...

  • Block-介绍

    Block简单介绍首先Block是iOS中比较特殊的一种数据类型Block是苹果官方比较推荐使用的数据类型,应用也...

  • block-循环引用

    block的循环引用,在日常开发中,我们常常遇到,但是可能部分新人还不太了解为何会循环引用,到底是如何循环引用理解...

  • __block-内存管理

    我们创建一个对象如果我们block内部用到了__block类型的变量,他会拥有这个对象,我们可以通过cpp文件来分...

  • 九、Block之(一)Block内部结构及调用本质

    一、Block内部数据结构 1.调用分析 2.关于block调用中 block->FunPrt()的理解 bloc...

网友评论

      本文标题:Block-类型

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