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 ...
随机推荐
- 缓存反向代理-Varnish
简介 Varnish是一款高性能.开源的缓存反向代理服务器.它从客户端接受请求,并尝试从缓存中响应请求,如果无法从缓存中提供响应,Varnish 向后端服务器发起请求,获取响应,将响应存储在缓存中,然 ...
- jquery--DOM操作基础
元素的访问 元素属性操作 获取:attr(name):$("#my").attr("src"); 设置:attr(name,value):$("#my ...
- 第2章 jQuery选择器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- python django-admin startproject django-admin命令未找到
在使用pip install安装django后使用django-admin生成项目失败解决办法 1.配置环境变量-在系统环境变量path添加后运行 D:\Program Files (x86)\pyt ...
- CRM2Stark组件
CRM stark组件 开启新项目:CRM 再创建一个应用app02(python manage.py startapp app02 或者是工具栏:run...task:执行startapp app0 ...
- 单片机-C语言-定义和申明
以下代码是单片机程序,51单片机,编译器为HT-IDE3000, 简单来说 头文件中只能申明, 变量在头文件中申明时,要加上extern 这个关键字用来告诉编译器,变量在其它的文件中定义,为什么要在头 ...
- java入门---基本数据类型之引用数据类型&数据类型转换
接着上一篇文章来,这次就先看看什么是引用数据类型?首先得满足以下条件: 在Java中,引用类型的变量非常类似于C/C++的指针.引用类型指向一个对象,指向对象的变量是引用变量.这些变量在声明时 ...
- springBoot整合ecache缓存
EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心 ...
- Linux getcwd()的实现
通过getcwd()可以获取当前工作目录. #include <unistd.h> char *getcwd(char *cwdbuf, size_t size); 成功调用返回指向cwd ...
- 成都Uber优步司机奖励政策(3月31日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...