Block简介

Block其实包含两个部分内容

  1. Block执行的代码,这是在编译的时候已经生成好的;
  2. 一个包含Block执行时需要的所有外部变量值的数据结构。 Block将使用到的、作用域附近到的变量的值建立一份快照拷贝到栈上。
  3. Block与函数另一个不同是,Block类似ObjC的对象,可以使用自动释放池管理内存

Block在内存中的位置

根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock。

  • NSGlobalBlock:类似函数,位于text段;
  • NSStackBlock:位于栈内存,函数返回后Block将无效;
  • NSMallocBlock:位于堆内存。
Block被另一个Block使用时,另一个Block被copy到堆上时,被使用的Block也会被copy。但作为参数的Block是不会发生copy的。

Block对不同类型的变量的存取

基本类型

适用于MRC和ARC的情况

  • 局部自动变量,在Block中只读。Block定义时copy变量的值,在Block中作为常量使用,所以即使变量的值在Block外改变,也不影响他在Block中的值。
  • static变量、全局变量。Block就可以对它们进行读写了。因为全局变量或静态变量在内存中的地址是固定的,Block在读取该变量值的时候是直接从其所在内存读出,获取到的是最新值,而不是在定义时copy的常量。
  • Block变量,被__block修饰的变量称作Block变量。 基本类型的Block变量等效于全局变量、或静态变量。
ObjC对象

不同于基本类型,Block会引起对象的引用计数变化。

MRC:

  • 局部自动变量,在Block copy时,系统自动retain对象,增加其引用计数。
  • static变量,全局变量,在内存中的位置是确定的,所以Block copy时不会retain对象。
  • Block变量,在Block copy时也不会retain。
  • 实例变量,在Block copy时也没有直接retain 实例变量对象本身,但会retain 实例变量的拥有者self。所以在Block中可以直接读写 实例变量。

ARC:

  • 只有在使用local变量时,block会复制指针,且强引用指针指向的对象一次。其它如全局变量、static变量等,block不会拷贝指针,只会强引用指针指向的对象一次。
  • __block变量,在Block copy时会retain__block变量
    • struct __Block_byref_intValue_0
      {
      void *__isa;
      __Block_byref_intValue_0 *__forwarding;
      int __flags;
      int __size;
      int intValue;
      };
      struct __main_block_impl_0
      {
      struct __block_impl impl;
      struct __main_block_desc_0* Desc;
      __Block_byref_intValue_0 *intValue; // by ref
      __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, __Block_byref_intValue_0 *_intValue, int flags=) : intValue(_intValue->__forwarding)
      {
      impl.isa = &_NSConcreteStackBlock;
      impl.Flags = flags;
      impl.FuncPtr = fp;
      Desc = desc;
      }
      };

  • 标记了为__weak或__unsafe_unretained的local变量。block仍会强引用指针对象一次。

参考:http://my.oschina.net/u/1432769/blog/390401?fromerr=QO9ABGMC

http://tanqisen.github.io/blog/2013/04/19/gcd-block-cycle-retain/

Block使用要点的更多相关文章

  1. Objective-C编程 - 关于Block的要点

    1. 首先,我们快速过一下,什么是Block? Block是一段代码,它在OC中以^开头,可以有返回值,和参数列表,但就是没有名字. 所以,你可以把它认为是匿名函数. 事实上,它和Swift中的闭包( ...

  2. python自动化开发-[第十五天]-jquery

    今日概要 1.javascript补充 2.jquery 1.javascript-DOM绑定事件 1.事件类型 onclick 当用户点击某个对象时调用的事件句柄. ondblclick 当用户双击 ...

  3. ClickHouse源码笔记4:FilterBlockInputStream, 探寻where,having的实现

    书接上文,本篇继续分享ClickHouse源码中一个重要的流,FilterBlockInputStream的实现,重点在于分析Clickhouse是如何在执行引擎实现向量化的Filter操作符,而利用 ...

  4. EDM制作要点

    EDM是Email Direct Marketing的缩写,虽然也是html,但是和我们在网页上使用的html不同,因为安全原因,各大邮箱服务商级邮件客户端都会对邮件内容进行一定程度上的处理,不会按照 ...

  5. 1122MySQL性能优化之 Nested Loop Join和Block Nested-Loop Join(BNL)

    转自http://blog.itpub.net/22664653/viewspace-1692317/ 一 介绍  相信许多开发/DBA在使用MySQL的过程中,对于MySQL处理多表关联的方式或者说 ...

  6. iOS开发ARC内存管理技术要点

    本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...

  7. Linux运维入门到高级全套常用要点

    Linux运维入门到高级全套常用要点 目 录 1. Linux 入门篇................................................................. ...

  8. block的内部实现

    主要内容: 一.block相关的题目 二.block的定义 三.block的实现 四.捕获自动变量值 五.block存储区域 六.截获对象 一.block相关的题目 这是一篇比较长的博文,前部分是bl ...

  9. Block存储区域

    Block存储区域 首先,需要引入三个名词: ● _NSConcretStackBlock ● _NSConcretGlobalBlock ● _NSConcretMallocBlock 正如它们名字 ...

随机推荐

  1. SQLite.dll混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

    其他信息: V5.7.4.4 Can't find the System.Data.SQLite.dll more info : 混合模式程序集是针对"v2.0.50727"版的运 ...

  2. KMP快速模式匹配的java实现

    假期实在无聊赖啊.把这个算法实现了一下即算是打发时间也算练练手了. KMP算法的关键是用归纳法计算失败函数.网上很详细了.下面直接给出代码. /** * * @author Vincent * */ ...

  3. hdu 4753 Fishhead’s Little Game

    状态压缩dp解博弈问题(记忆化搜索).比赛的时候最后才开始做这道题,而且当时不知道为什么一直犯一些很2B的问题,导致没能ac,晚上看了看原先的代码,改了一下就MLE了...我原先是开的dp[1 < ...

  4. Swift版音乐播放器(简化版),swift音乐播放器

    这几天闲着也是闲着,学习一下Swift的,于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神, 希望对大家有帮助! 这个DEMO里,使用到了 AudioPlayer(对音 ...

  5. 【Tarjan,LCA】【3-21个人赛】【problemD】

    Problem D Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Sub ...

  6. js写的复制功能,只支持IE

    如果用js写,只能支持IE,如果想全支持,需要用jQuery的插件:jquery.zclip.js 下面是用js写的: var copyHref = function(){               ...

  7. IIS ,未能加载文件或程序集“System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。

    1.解决办法:安装MSChart.exe程序 图表控件,下载附件,以管理员身份运行安装.

  8. ORACLE 查询表定义

    很多文章使用DESC tablename查看,这是查看的表结构,不是表定义. 如下: 1.set long 99999;  --增大输出缓冲区 2.SELECT dbms_metadata.get_d ...

  9. ExecutorService 的理解与使用

    ExecutorService 的理解与使用  http://my.oschina.net/bairrfhoinn/blog/177639 Java线程池ExecutorService http:// ...

  10. poj3292-类素数筛选法

    #include<iostream>using namespace std;const int N=1000002;int array[N]={0};int main(){ int n;  ...