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 ...
随机推荐
- Git 原理入门
Git 是最流行的版本管理工具,也是程序员的必备技能之一. 即使天天使用它,很多人也未必了解它的原理.Git 为什么可以管理版本?git add.git commit这些基本命令,到底在做什么,你说得 ...
- 使用PHPExcel 对表格进行,读取和写入的操作。。。。
下面的代码是使用PHPExcel 对多个表格数据进行读取, 然后整合的写入新的表格的方法!!!代码有点粗糙 , 多多保函!!! 这里有些地方注意下,如果你的表格数据过大, 一定要记得修改php.ini ...
- Hadoop原理之——HDFS原理
Hadoop 3个核心组件: 分布式文件系统:Hdfs——实现将文件分布式存储在很多的服务器上(hdfs是一个基于Linux本地文件系统上的文件系统) 分布式运算编程框架:Mapreduce——实现在 ...
- 2.2 vivi虚拟视频驱动测试
学习目标:在linux终端安装xawtv,并测试vivi.ko驱动程序. 一.安装xawtv 1)ubuntu能上网情况下,使用命令:# sudo apt-get install xawtv 2)如果 ...
- python学习笔记:第13天 内置函数(一)
详细文件查看点击这里:详细地址
- JavaWeb——升级赛-学生成绩管理系统(2).java---19.01.03
dao.java package Dao; import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLExcept ...
- 十分钟搭建和使用ELK日志分析系统
前言 为满足研发可视化查看测试环境日志的目的,准备采用EK+filebeat实现日志可视化(ElasticSearch+Kibana+Filebeat).题目为“十分钟搭建和使用ELK日志分析系统”听 ...
- Apache Tomcat 8.5 安全配置与高并发优化
通常我们在生产环境中,Tomcat的默认配置显然不能满足我们的产品需求,所以很多时候都需要对Tomcat的配置进行调优,以下综合我自己的经验来配置 Tomcat 安全与优化情况,如果你有更好的方案,请 ...
- python中通过datetime获取UTC时间ISO格式
一个热点统计需求,需要限定一个时间范围,计算出该范围内的热点事件,相关数据则以UTC标准时间的ISO时间格式存在mongodb中,和服务器设置的时区UTC+8并不一致. 为了解决这个问题,直觉反应是在 ...
- 深圳Uber优步司机奖励政策(1月4日~1月10日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...