博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
block详解
阅读量:5940 次
发布时间:2019-06-19

本文共 1402 字,大约阅读时间需要 4 分钟。

Objective-C 中 Block 有三种类型:

NSStackBlock    存储于栈区NSGlobalBlock   存储于程序数据区NSMallocBlock   存储于堆区 block 内部没有引用外部变量的 Block 类型都是 NSGlobalBlock 类型,存储于全局数据区,由系统管理其内存,retain、copy、release操作都无效。 block 变量在赋值的时候系统自动将其拷贝到堆区了,造成我们看到变量 block 是 NSMallocBlock 类型。 Block属性的特性限定符一般都是 copy,因为其setter方法中会拷贝一份新的副本到堆区 系统在编译block时,发现有个num变量,外部没有用__block修饰,系统会在堆区中创建一个同名同类型的变量,在真正执行代码的时候,如果没有对num进行修改的操作,那么就会直接调用堆区中的num的值,这个值是在编译的时候已经赋给堆区变量的,打印(简单地说这个时候block内部与外部没有任何的关系),当block执行完毕后,调用的num还是之前的栈区中创建的num 程序在编译block代码块的时候,发现num是被__block修饰的,就不会上来就在堆区中创建num变量,而是在执行到这里的时候才去按照外部的同名变量去在堆区中创建num,与此同时,会修改外部变量的地址,这个地址是堆区中num的地址,所以在最后打印num的地址,是指向堆区的,因而获取的值也是堆区中num的值 当block作为函数参数时为_NSConcreteStackBlock类型。在函数中,在block执行完毕前,函数是不会退出的。 block作为函数的返回值时为_NSMallocBlock类型 不应该使用__weak来修饰对象,让dispatch_after对self进行持有,保证block执行时self还未被释放。

 在block执行开始时self对象还未被释放,而执行过程中,self被释放了,此时访问self时,就会发生错误。

 对于这种场景,应该在block中对 对象使用__strong修饰,使得在block期间对 对象持有,block执行结束后,解除其持有。

 
block结构体定义如下:

  struct Block_layout{

        void *isa;//指向表明该block类型的类  是_NSConcreteStackBlock

         int flags;//按bit位标示一些的block的附加信息,比如判断block类型、判断block引用计数、判断block是否需要执行辅助函数等。

         int reserved;//保留变量

         void (* invoke)(void *,...);//函数指针,执行具体的block实现的函数调用地址。

         struct Block_descriptor  *descriptor;//block的附加信息,比如保留变量数,block的大小,进行copy活dispose得辅助函数指针。

         /*Imported variables*/ //因为block有比暴行,所以可以访问block外部的局部变量。这些variables就是复制到结构体中的外部局部变量或变量的地址。 

  };

转载于:https://www.cnblogs.com/diyigechengxu/p/9187891.html

你可能感兴趣的文章
世界银行拨款2293万美元支持印度并网屋顶太阳能
查看>>
中国电信制定物联网策略:规模市场自主经营 长尾市场集成
查看>>
希捷撤离 硬盘的那些风花雪月记忆
查看>>
人工智能数据中心
查看>>
QA请勿忘初心
查看>>
协作与大数据构建新型打假模式
查看>>
崛起的中国服务器市场迎来旺盛的SPEC测试需求
查看>>
7月17日云栖精选夜读:深度 | 两个案例,掌握AI在大数据领域的前沿应用
查看>>
蚂蚁财富联手百会CRM全面升级金融服务
查看>>
视频转成flv格式
查看>>
英特尔分拆McAfee:31亿美元将多数股权卖给投资公司TPG
查看>>
AWS S3宕机的启发: 云必须分散化
查看>>
零基础学习SVN之(二):CVS与SVN的区别
查看>>
HP Webinspect 10 访问wap的url
查看>>
单元测试Struts2的Action(包含源码)
查看>>
Linux存储入门:简易数据恢复方案--分区和LVM实战
查看>>
客服运营三部曲
查看>>
思科分析引擎助力大型数据中心应用发展
查看>>
7 种常用的排序算法直观感受
查看>>
程序员,告诉他们被打断的真实代价
查看>>