blcok的总结
没有引用外部变量的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的总结的更多相关文章
- Block解析(iOS)
1. 操作系统中的栈和堆 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方 ...
- 深入学习HBase架构原理
HBase定义 HBase 是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtabl ...
- css权威指南--笔记
第1章 css和文档 1,元素:替换元素(img input),非替换元素(大多数span). 2,link:rel(代表关系:stylesheet,候选样式表:alternate styleshee ...
- Django模板的继承
一.extend 1.extend继承模板 2.一个文件中只能继承一个模板 3.extend继承模板中的所有内容,模板的内容包括:html的head和body ,eg:
- [LeetCode] Range Sum Query - Mutable 区域和检索 - 可变
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...
- MySQL · 答疑解惑 · MySQL 锁问题最佳实践
http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会 ...
- 前端试题本(HTML+CSS篇)
CS1. 下面关于IE.FF下面CSS的解释区别描述正确的有?(不定项)CS2请选出结构正确的选项CS3.下面哪些是HTML5 新增的表单元素?CS4在使用table表现数据时,有时候表现出来的会比自 ...
- IOS开发之自定义Button(集成三种回调模式)
前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...
- jquery的show/hide/toggle详解
通过阅读源码我们发现show,hide,toggle调用了showHide和isHidden这2个方法,所以我们要搞明白原理必须先看一下这2个方法. jQuery.fn.extend({ ...... ...
随机推荐
- 关于在C#中构造函数中调用虚函数的问题
在C#中如果存在类的继承关系,应避免在构造函数中调用虚函数.这是由于C#的运行机制造成的,原因如下: 新建一个类实例时,C#会先初始化该类(对类变量赋值,并将函数记在函数表中),然后再初始化父类.构造 ...
- 获取ItemsControl中当前item的binding数据
直接用 {Binding} 就可以了,如下: <ItemsControl ItemsSource="{Binding Path=ProcessItems}"> < ...
- ACM: Happy 2004-数论专题-因子求和-快速幂
Happy 2004 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descript ...
- ACM: 强化训练-Inversion Sequence-线段树 or STL·vector
Inversion Sequence Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%lld & %llu D ...
- C语言中if语句
C语言if语句后面的表达式 C语言中if关键字之后(即括号内)均为表达式. 该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量,这些变量的值都换算成了逻辑 ...
- html5 可以讓使用者輸入url網址 ,去play影片
<html> <head> <title>Simple Video Example</title> <script> function pl ...
- String之“==”与equals
有时候String类型用“==”判断相等时无法成功,经过实验,用string.equals方法可以判断成功!! for (int i = 0; i < 10000; i++) { Strin ...
- How to get SQLite work on windows phone 8
1.Install SQLite for Windows Phone SDKC:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\Exten ...
- js正则验证之不能使用相同字符
在我们的前端开发中,为了不让用户输入相同的密码字符以提高其安全性,我们会写一个js方法来实现这个功能.接下来,我就来实现这个方法,有其他好的解决办法,敬请留言,博主必定向其学习. function _ ...
- HighchartsJS创建点状带标识的图表实例
上一篇我发布的是关于 HighchartsJS创建环形带标识的图表实例, 从那篇文章就可以看出 HighchartsJS 确实是一款功能很强大的图表库.利用它,我们可以在项目中创建出我们所需要的图表来 ...