• block类似与函数指针,与函数指针的区别在于其可以捕获(capture)其定义时作用域内的变量,当在其他位置调用时仍然可以使用。

  • block是一种Objective-C对象,其数据结构中存在isa指针,isa指针指向&_NSConcreteStackBlock或&_NSConcreteGlobalBlock。

  • block通常是在函数内定义的,此时block对象是在栈内分配的,若此block只在定义它的函数内使用,则block就会一直存在在栈中,当函数返回时,栈帧回退,定义的block也随之销毁。

  • 当block需要在其定义时的函数外使用时,需要对其进行copy处理,copy的意义在于将block在堆中分配一份,这样当定义函数的栈帧回滚时,block仍然存在。
    1. copy操作可以向block对象发送-copy消息,也可使用C函数Block_copy(),释放操作则为-release或Block_release().
    2. 对block应该总是进行copy操作,因为对栈内分配的block拷贝会将其拷贝到堆中,对已经在堆中的block进行copy,则只会增加retain count,与retain操作相同。而对栈内分配的block进行retain操作则不会有任何影响。
  • block之所以强大在于其可以捕获(capture)其引用的变量,包括局部变量,指针,Objective-C对象,全局变量,static变量等。
    1. 全局变量,static变量在block内是直接访问的,因为其内存区域一直存在。
    2. 对于引用的局部变量,block使用的方法是将局部变量拷贝到block内部,并声明为const,这样在block中将只能使用引用到局部变量的初始值,而不能进行修改。
    3. 局部指针变量被block const拷贝后仍然是指针,虽然指针本身是const的,但其指向的对象仍然是可以修改的。
    4. 如果想对引用的局部变量进行修改,可以在局部变量上使用__block标示符号,使用__block后的局部变量会以一种指针的方式被间接引用,引用其的block不会进行const copy,所有block、包含定义的函数内看到的__block局部变量都是同一份,任何block中对此变量进行修改都可以被其他block看到。在引用__block局部变量的block被从栈拷贝到堆时,__block变量也会被拷贝到堆中,所以__block变量在运行时是会变化的。
    5. 在block引用Objective-C对象时,会对Objecitive-C对象进行retain操作,当block销毁时再进行release操作。如果不想对引用的Objecitive-C对象做retain处理,则可以使用__block 标示要引用的Objecitive-C对象,这只适用于非ARC的代码中。在ARC代码中,即使用__block标示,在block引用时仍然会retain,这中情况下则需要使用__weak(iOS5)或__unsafe_unretained(iOS4,不支持weak的环境)。
    6. 如果在类方法中定义的block引用了类中的实例变量,则实际上是通过self以self->instanceVar的方式引用的,这是会对self做retain操作。这样会出现retain cycles,为了避免这中情况,一般会声明一个局部变量blockSelf,将self以__block或__weak,__unsafe_unretained的方式赋值给blockSelf,在block代码中则通过blockSelf引用类示例变量,这样可以避免retain cycles。

    参考:
    Block Implementation Specification
    Language Specification for Blocks
    Blocks Programming Topics
    How blocks are implemented (and the consequences)
    Blocks, Episode 2: Life Cycles
    Programming with C Blocks
    Using Blocks: Understanding the Memory Management Rules
    Friday Q&A 2008-12-26 blocks
    Friday Q&A 2009-08-14: Practical Blocks
    Friday Q&A 2010-04-30: Dealing with Retain Cycles
    Friday Q&A 2011-09-30: Automatic Reference Counting
    Block的Retain Cycle的解决方法

本文出自 清风徐来,水波不兴 的博客,转载时请注明出处及相应链接。

本文永久链接: http://www.winddisk.com/2012/08/07/blocks/

IOS Blocks 详细介绍相关推荐

  1. iOS SDWebImage详细介绍

    在iOS的图片加载框架中,SDWebImage使用频率非常高.它支持从网络中下载且缓存图片,并设置图片到对应的UIImageView控件或者UIButton控件.在项目中使用SDWebImage来管理 ...

  2. 明日之后android和ios,明日之后安卓ios互通区有哪些?ios安卓混服区详细介绍

    原标题:明日之后安卓ios互通区有哪些?ios安卓混服区详细介绍 明日之后安卓ios是有互通区的,但是昨天安卓平台上线之后,很多安卓玩家找不到互通区服务器,所以今天小编给大家说说游戏中具体的互通服务器 ...

  3. iOS开发 UILabel 详细介绍(属性+富文本)

    UILabel是iOS开发中最常用的一种标签了,在开发过程中,会用到各种个样的标签属性,一段文字中变颜色或者字体的样式等(这些都是富文本中的内容,用于美化文字),下面就让我来给大家做一个详细的UILa ...

  4. iOS开发系列--让你的应用“动”起来--超详细的ios核心动画介绍

    概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...

  5. 微信小程序 app.json 详细介绍

    微信小程序 app.json 详细介绍 {// 写各个页面的路径 (新增页面或者减少页面都要对其进行修改)"pages": ["pages/index/index&quo ...

  6. 相册服务器位置,王者荣耀游戏相册是什么 游戏相册开放服务器以及功能使用详细介绍...

    王者荣耀游戏相册哪些服务器开放了?新功能怎么使用?对于这个新上线的功能,小伙伴们不太了解吧!没关系,下面是大麦子小编整理出来的游戏相册开放服务器以及功能使用详细介绍,希望可以帮到大家. 游戏相册灰度发 ...

  7. android 自定义View 的详细介绍

    为什么80%的码农都做不了架构师?>>>    今天 看了好几篇 自定义组件的介绍,加上自己 练习了一把 ,准备 结合 别人的想法以及自己的理解,将自定义组件详细的记录下来,自己学习 ...

  8. mysql 死锁 代码_MySQL死锁问题解决的代码详细介绍

    一次MySQL死锁问题解决 一.环境CentOS, MySQL 5.6.21-70, JPA 问题场景:系统有定时批量更新数据状态操作,每次更新上千条记录,表中总记录数约为500W左右. 二.错误日志 ...

  9. 快狐未能连接服务器,航海王强者之路好友福袋开启详细介绍_快狐快狐视频app...

    航海王强者之路是一款十分热血的手机游戏,游戏根据著名的动漫海贼王改编,在游戏中,玩家可以体验到很多海贼王的经典剧情,最近游戏官方也为众多玩家准备了很多活动,我们就一起来看看吧,希望你们对这次活动有所了 ...

最新文章

  1. C#中将结构类型数据存储到二进制文件中方法
  2. 【竞赛相关】Kaggle知识点:入门到进阶的10个问题
  3. SAP Spartacus CORS 设置
  4. 数据结构 树和二叉树
  5. spark streaming python实例_kafka+spark streaming代码实例(pyspark+python)
  6. Ansible(六)对目标主机进行磁盘分区,创建逻辑卷、格式化并挂载
  7. rpg游戏地图绘制android,基于Android studio 的rpg游戏大地图的绘制
  8. Axure RP 10 安装方法
  9. macos系统安装homebrew包管理工具
  10. LSF - 集群概览
  11. Unity Spine SkeletonGraphic 动画重复播放 过度残影透明渐变Bug 解决方案
  12. 从eclipse官网下载32位eclipse并配置tomcat
  13. Linux技术--mysql数据库基础操作
  14. 视频监控系统上云解决方案EasyCVR集成海康EHome私有协议系列——文件查找操作流程
  15. Python机器学习应用之监督学习-上证指数涨跌预测实例
  16. 奔跑吧恐龙----基于JavaSwing的一个跑酷游戏
  17. 【腾讯云服务器+PicGo搭建自己的图床】利用腾讯云服务器搭建自己的私人图床
  18. safari cookie_如何在OS X上清除Safari的浏览历史记录和Cookie
  19. oracle 地图引擎,基于 Web 的地图服务引擎的设计与实现
  20. 计算机考研题目汇总【持续更新】

热门文章

  1. XX大厦综合布线系统方案
  2. 相比国产手机的傲慢,苹果进一步降价取悦中国消费者
  3. 机器学习优化中的交叉熵及改进形式
  4. php开发工具PhpStorm V2022.2正式发布——支持Mockery 和 Rector
  5. 漂洋过海来看你 老歌
  6. 【计算机系统结构】Self-modifying code 自修改代码
  7. linux svn revert,svn revert 复原整个目录
  8. java16.语言进阶------本地文件操作---文件的简单读写
  9. 模板——函数模板与类模板
  10. r5 4600h和i5 10300h有什么区别 r54600h和i510300h处理器哪个好