没有引用外部变量的block  为 __NSGlobalBlock__ 类型(全局block)

MRC:

引用外部变量的block  为 __NSStackBlock__ 类型(栈区block)  栈区中的block,申明属性用copy,可以从栈区拷贝到堆区

使用copy修饰的原因是 :防止block 在作用域结束之后还没有被调用 就被销毁  放到堆区就可以在作用域结束之后  还可以调用

ARC:

引用外部变量的block 为 __NSMallocBlock__ 类型(堆区block) 申明属性用copy或strong 修饰都可以 系统会自动将栈区block拷到堆区

block 引用外部的栈区的局部变量   将该变量从栈区中拷贝一份到堆区中

block 要改变外部局部变量的值  需要将外部局部变量 用__block修饰

面试题:

__block int i = 10;

//从栈自动拷贝到堆中,i也被拷贝

void (^myblock)() = ^{

NSLog(@"%d",i);        后输出i = 10

};

i= 20;

NSLog(@"----->%d",i);       先输出i = 20

[self passBlock:myblock];

循环引用的问题:

当 block 对当前控制器 强引用  控制器也对block强引用时  需要将控制器用  __weak修饰  防止循环引用的问题

总结:

关于block内存管理,当block内部没有引用外部变量时,block存放在全局区,也就是NSGlobalBlock;在MRC下,当block内部引用外部变量时,block存放在栈区,也就是NSStackBlock;当对该栈区的block进行copy操作时,block将存放在堆区。在ARC下,当block内部引用外部变量时,block存放在堆区;关于堆区与栈区的区别,栈区主要存放局部变量,定义的参数等,在函数结束,系统会自动回收其内存空间,而堆区一般用程序员自行分配释放,若程序员不释放,程序结束时,由系统回收。总的来说,使用栈区更为快捷,而使用堆区更为灵活。

blcok的总结的更多相关文章

  1. Block解析(iOS)

    1. 操作系统中的栈和堆 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方 ...

  2. 深入学习HBase架构原理

    HBase定义 HBase 是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtabl ...

  3. css权威指南--笔记

    第1章 css和文档 1,元素:替换元素(img input),非替换元素(大多数span). 2,link:rel(代表关系:stylesheet,候选样式表:alternate styleshee ...

  4. Django模板的继承

    一.extend 1.extend继承模板 2.一个文件中只能继承一个模板 3.extend继承模板中的所有内容,模板的内容包括:html的head和body ,eg:

  5. [LeetCode] Range Sum Query - Mutable 区域和检索 - 可变

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  6. MySQL · 答疑解惑 · MySQL 锁问题最佳实践

    http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会 ...

  7. 前端试题本(HTML+CSS篇)

    CS1. 下面关于IE.FF下面CSS的解释区别描述正确的有?(不定项)CS2请选出结构正确的选项CS3.下面哪些是HTML5 新增的表单元素?CS4在使用table表现数据时,有时候表现出来的会比自 ...

  8. IOS开发之自定义Button(集成三种回调模式)

    前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...

  9. jquery的show/hide/toggle详解

    通过阅读源码我们发现show,hide,toggle调用了showHide和isHidden这2个方法,所以我们要搞明白原理必须先看一下这2个方法. jQuery.fn.extend({ ...... ...

随机推荐

  1. gridview自定义排序

    效果如图: 首先允许排序:AllowSorting="True":开启gridview的排序事件onsorting="GridView1_Sorting",也可 ...

  2. Struts2上传大小限制

    Struts中报错 the request was rejected because its size (***) exceeds the configured maximum (2097152) 最 ...

  3. linux 安装vbox增强工具

    首先在虚拟机控制台点设备--------安装增强功能,这样会用虚拟光驱加载增强功能镜象. 然后打开终端,先转到root身份:=================su================= f ...

  4. Storm DRPC实现机制分析

    DRPC是建立在Storm基本概念(Topology.Spout.Bolt.Stream等)之上的高层抽象,个人理解它的目标是在Storm 集群之上提供一种分布式的RPC框架,以便能够利用Storm快 ...

  5. 2017亚洲VR&AR博览会暨高峰论坛

    2017亚洲VR&AR博览会暨高峰论坛 2017 Asia VR&AR Fair & Summit(VR&AR Fair 2017) 活动介绍活动时间: 2017年3月 ...

  6. webpack: require.ensure与require AMD的区别

    http://blog.csdn.net/zhbhun/article/details/46826129

  7. Haproxy内网连接阿里云存储OSS后提供下载

    global log 127.0.0.1 local0 maxconn #最大连接数 chroot /usr/local/haproxy uid #所属运行的用户UID gid #所属运行用用户组 d ...

  8. ACM D的小L

    D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2   描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...

  9. ACM Minimum Inversion Number 解题报告 -线段树

    C - Minimum Inversion Number Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &a ...

  10. c++实现des算法

    程序分三部分,des头文件,des类实现,main函数调用. //panda //2013-4-13 //des //des.h class DES { private: //public: //明文 ...