block知识总结
一.block在内存中存在的形式
1.当把block句法写在函数或者方法外面时,系统会在静态数据区分配一块内存区域给block对象。这片区域在程序执行期会一直存在。
2.当block句法写在函数或者方法内部时,block对象被分配在栈上。
3.当对block执行copy操作时,如果block在栈上,则复制到堆上,如果block本来已经在堆上,则不进行复制而直接返回堆上的对象增加该对象的引用计。
二.block内基本变量(非对象)的行为
block可以访问它所在函数体内该函数的变量,但是对于不同的变量类型,这些变量有不同的行为。
1.对于全局变量,block可直接访问和修改全局变量的值,因为当block访问它们时传递的是它们的指针。
2.对于static修饰的局部变量,block可直接访问和修改变量的值,同样是因为当block访问它时传递的是它的指针。
3.除以上两种外的局部变量(栈内变量),block只可访问值而不能修改,因为这种情况下是值传递,无法对原值进行修改。
4.如果想在block内修改函数的局部变量,要在变量前加__block修饰符,当block访问带有__block修饰的局部变量时,传递的是该变量的地址。
三.block内使用对象时的行为
1.方法内的block可以直接访问实例变量,也可以改变其值。
2.方法内的block中存在实例变量时,如果在栈上生成block的副本,retain就会被发送给self而非实例变量,引用计数器的值也会加1。实例变量的类型不一定非得是对象。
3.block句法内存在非实例变量对象时,如果在栈上生成某个对象的副本,包含的对象就会接收到retain,引用计数器的值也会增加。
4.已经复制后,堆区域中某个block即使收到copy方法,结果也只是block自身的引用计数器加1。包含的对象的引用计数器的值不变。
5.复制的块对象在被释放时,也会向包含的对象发送release。
四.ARC和非ARC下block的操作的区别
1.由于block一般是分配在栈上的,为了能保留使用,就必须对block进行copy操作。在 ARC 下,编译器会自动检测,在需要保存block对象时自动插入copy操作,具体地说就是在被带入强访问变量以及被作为return的返回值返回的时候,编译器会对block自动进行copy操作。但当将 block 当作方法参数时候,编译器不会自动进行拷贝,需要我们手动拷贝该 block 对象。幸运的是,Cocoa 库中的大部分名称中包含”usingBlock“的接口以及 GCD 接口在其接口内部已经进行了拷贝操作,不需要我们再手动处理了。但除此之外的情况,就需要我们手动干预了。
2.在MRC下,则完全由程序员来对block进行管理,编译不会自动进行copy操作,由此要特别小心,避免出现block被过早释放现象的发生而导致的程序崩溃。
五.使用block注意事项
1.使用前要做判空,运行一个空block变量将会导致程序崩溃。
2.避免循环引用。使用block时可能会造成循环引用,很多时候一个类拥有一个block,而如果在block里我们又使用了self(该类)的实例变量,因为使用block时一般都会进行copy操作的,此时self的引用计数将被加1,形成了self拥有block,block又持有self的循环引用,要打破这种循环我们需要先定义self 的一个弱引用 wself,然后在block内用使用弱引用。
3.在多线程环境下(block中的weakSelf有可能被析构的情况下),需要使用weak–strong dance技术,先将weakSelf转为strong指针,避免在运行到某个关键步骤时self对象被析构。
block知识总结的更多相关文章
- [New learn]讲解Objective-c的block知识-实践
1.简介 在之前的文章[New learn]讲解Objective-c的block知识中介绍了block的相关知识.本章中我们将以一个实际例子来简单介绍一下block如何代替代理. 2.原有通过代理实 ...
- [New learn]讲解Objective-c的block知识
1.简介 OC的Block感觉就是C中饿函数指针,提供回调功能,但是OC中的block比C的函数指针要更加强大,甚至可以访问本地变量和修改本地变量. block在oc中是一个对象,它可以像一般的对象那 ...
- inode与block知识总结
inode概述:硬盘要分区,然后格式化,创建文件系统在每个Linux存储设备的分区被格式化为ext3文件系统后一般有两个部分: 第一部分Inode:存储这些数据的属性信息(大小,属主,归属的用户 ...
- 指向函数的指针与iOS-Block相关知识
指向函数的指针与iOS-Block相关知识 一. 函数指针的定义和调用: 关于函数指针的知识详细可参考:http://www.cnblogs.com/mjios/archive/2013/03/19/ ...
- L009文件属性知识详解小节
本堂课分为5部分内容 1.linux下重要目录详解 2.PATH变量路径内容 3.linux系统中文件类型介绍 4.linux系统中文件属性详细介绍 5.linux系统文件属性inode与block知 ...
- 负margin新解
第一篇 我知道你不知道的负Margin 分类: Html/CSS | 转载请注明: 出自 海玉的博客 本文地址: http://www.hicss.net/i-know-you-do-not-know ...
- 我知道你不知道的负Margin
现如今,负margin技术的应用可谓越来越广,任一个大型站点惊鸿一瞥之下都会有其身影所在.个人认为负margin技术是学习css路上必不可缺少的课题之一,许多高级应用及疑难杂症修复都可以使用负marg ...
- Linux文件系统及文件属性
一.Linux文件系统 1.穿件文件系统 Linux中当磁盘格式化创建文件系统时,会创建一定数量的节点索引Inode以及一定数量的块block,其中inode具有存储文件属性以及指向文件实体block ...
- C语言函数指针 和 OC-Block
C语言函数指针 和 OC-Block 一. C语言函数指针 关于函数指针的知识详细可参考:http://www.cnblogs.com/mjios/archive/2013/03/19/2967037 ...
随机推荐
- 使用js实现单向绑定
详细解释单向绑定 参考资料 MDN addEventListener()定义与用法 <!DOCTYPE html> <html lang="en"> < ...
- css 浮动说明
clear:both; 1.要了解的:什么是浮动.浮在某面板之上. 例如:float:left; 向左停靠, 就是让需要设置浮动的元素,跟在指定元素后面. 先上实例: 比较常用导航: .nav_ul ...
- shell入门基础&常见命令及用法
shell shell是一个命令解释器,实际是一个程序,/bin/bash,linux中所有的命令都由它来解释,有自己的语法 shell脚本 以.sh结尾 shell语法+linux命令 注释: 单行 ...
- php源码建博客5--建库建表-配置文件-错误日志
主要: 整理框架 建库建表 配置文件类 错误日志记录 --------------本篇后文件结构:-------------------------------------- blog ├─App │ ...
- Excel2003 去除重复项
利用 数据透视表 间接 获得 非重复项 1] 选中要去除重复项 的列 数据 2] 3]将选中列移动到 左侧 即可 4] 或者导入到Access中,用sql 语句中的 distinct SELECT D ...
- Git 与 SVN对比详解
一.Git vs SVNGit 和 SVN 孰优孰好,每个人有不同的体验. Git是分布式的,SVN是集中式的 这是 Git 和 SVN 最大的区别.若能掌握这个概念,两者区别基本搞懂大半.因为 Gi ...
- java 写一个单例设计程序,打印出该对象的地址
class Test{ public static void main(String[] args) { singleton s1=singleton.getinstance(); singleton ...
- C#LINQ集合操作
LINQ的集合运算 List<int> lstOne = new List<int>() { 1, 55, 223, 25 }; List<int> lstTwo ...
- R语言爬虫:穿越表单
使用rvest包实现实现穿越表单以及页面的跳转 formurl <- "http://open.xmu.edu.cn/oauth2/authorize?client_id=1010&a ...
- 【BZOJ2286】消耗战(虚树,动态规划)
[BZOJ2286]消耗战(虚树,动态规划) 题面 BZOJ Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总 ...