block详解
Objective-C 中 Block 有三种类型:
NSStackBlock 存储于栈区 NSGlobalBlock 存储于程序数据区 NSMallocBlock 存储于堆区block 内部没有引用外部变量的 Block 类型都是 NSGlobalBlock 类型,存储于全局数据区,由系统管理其内存,retain、copy、release操作都无效。 block 变量在赋值的时候系统自动将其拷贝到堆区了,造成我们看到变量 block 是 NSMallocBlock 类型。 Block属性的特性限定符一般都是 copy,因为其setter方法中会拷贝一份新的副本到堆区 系统在编译block时,发现有个num变量,外部没有用__block修饰,系统会在堆区中创建一个同名同类型的变量,在真正执行代码的时候,如果没有对num进行修改的操作,那么就会直接调用堆区中的num的值,这个值是在编译的时候已经赋给堆区变量的,打印(简单地说这个时候block内部与外部没有任何的关系),当block执行完毕后,调用的num还是之前的栈区中创建的num 程序在编译block代码块的时候,发现num是被__block修饰的,就不会上来就在堆区中创建num变量,而是在执行到这里的时候才去按照外部的同名变量去在堆区中创建num,与此同时,会修改外部变量的地址,这个地址是堆区中num的地址,所以在最后打印num的地址,是指向堆区的,因而获取的值也是堆区中num的值 当block作为函数参数时为_NSConcreteStackBlock类型。在函数中,在block执行完毕前,函数是不会退出的。 block作为函数的返回值时为_NSMallocBlock类型 不应该使用__weak来修饰对象,让dispatch_after对self进行持有,保证block执行时self还未被释放。
在block执行开始时self对象还未被释放,而执行过程中,self被释放了,此时访问self时,就会发生错误。
对于这种场景,应该在block中对 对象使用__strong修饰,使得在block期间对 对象持有,block执行结束后,解除其持有。
block结构体定义如下:
struct Block_layout{
void *isa;//指向表明该block类型的类 是_NSConcreteStackBlock
int flags;//按bit位标示一些的block的附加信息,比如判断block类型、判断block引用计数、判断block是否需要执行辅助函数等。
int reserved;//保留变量
void (* invoke)(void *,...);//函数指针,执行具体的block实现的函数调用地址。
struct Block_descriptor *descriptor;//block的附加信息,比如保留变量数,block的大小,进行copy活dispose得辅助函数指针。
/*Imported variables*/ //因为block有比暴行,所以可以访问block外部的局部变量。这些variables就是复制到结构体中的外部局部变量或变量的地址。
};
block详解的更多相关文章
- iOS开发——Block详解
iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...
- Block详解一(底层分析)
本篇博客不再讲述Block的基本定义使用,最近而是看了很多的block博客讲述的太乱太杂,所以抽出时间整理下block的相关底层知识,在讲述之前,提出几个问题,如果都可以回答出来以及知道原理,大神绕过 ...
- Block详解二(底层分析)
Block专辑: Block讲解一 MRC-block与ARC-block Block详解一(底层分析) 今天讲述Block的最后一篇,后两篇仅仅是加深1,2篇的理解,废话少说,开始讲解! __blo ...
- objective-c block 详解 转
Block Apple 在C, Objective-C, C++加上Block這個延申用法.目前只有Mac 10.6 和iOS 4有支援.Block是由一堆可執行的程式組成,也可以稱做沒有名字的F ...
- CSS包含块containing block详解
“包含块(containing block)”,W3c中一个很重要的概念,今天带大家一起来好好研究下. 初步理解 在 CSS2.1 中,很多框的定位和尺寸的计算,都取决于一个矩形的边界,这个矩形,被称 ...
- ios Block详解
一. iOS代码块Block 1.1 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返回值, ...
- 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解
CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...
- css学习--inline-block详解及dispaly:inline inline-block block 三者区别精要概括
*知识储备: 内联元素:是不可以控制宽和高.margin等:并且在同一行显示,不换行. 块级元素:是可以控制宽和高.margin等,并且会换行. 1.inline-block 详解 (1)一句话就是在 ...
- hadoop学习WordCount+Block+Split+Shuffle+Map+Reduce技术详解
转自:http://blog.csdn.net/yczws1/article/details/21899007 纯干货:通过WourdCount程序示例:详细讲解MapReduce之Block+Spl ...
随机推荐
- 第三百九十七节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,主题本地化设置
第三百九十七节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,主题本地化设置 主题设置是在xadmin\plugins\themes.py这个文件 默认xadmin是通过下面这 ...
- 硬件信息 dmidecode dmesg lsdev lshw haparm lsusb
dmidecode 显示从BIOS中获取的硬件信息 dmesg 检测到的硬件和启动的消息 lsdev 显示关于安装硬件信息 cat /proc/devices 显示当前核心配置的设备 haparm - ...
- 131、ThreadLocal (转载)
http://blog.csdn.net/lufeng20/article/details/24314381 http://baike.baidu.com/link?url=7eL0qQm_5ULls ...
- Using Information Fragments to Answer the Questions Developers Ask
content : 1.采访了11个开发者,获得78个常问的问题:2.对78个问题进行分类,分为8类:These questions span eight domains of information ...
- Excel VBA 教程
https://www.w3cschool.cn/excelvba/ Excel VBA 编程教程 https://www.yiibai.com/vba VBA教程 http://www.acc ...
- autolayout 高度自适应
https://lvwenhan.com/ios/449.html #import "ViewController.h" #import "MyTableViewCell ...
- spring的一些其他功能
今天看书,知识点多一点了,涉及到了较多的知识,如scheduling计划任务,spring对多线程的支持,以及配置开发.测试和生产环境的profile.这些都是集成在spring中的,需要用时可以参考 ...
- 关于SMI、MSI、SCI、INTx各种中断小结【转】
转载自http://blog.csdn.net/huangkangying/article/details/11178425 目录(?)[-] MSI VS INTxPin-based interru ...
- VIVE pro和hololens购买调研
VIVE pro专业版是一款虚拟现实头盔 VIVE Pro专业版头显 ¥6,488 仅含头显,不含定位器及操控手柄送VIVEPORT会员服务2个月 订购VIVE Pro专业版头显,加 ¥2,400可得 ...
- yum install 下载后保存rpm包
keepcache=0 更改为1下载RPM包 不会自动删除 vi /etc/yum.conf [main] cachedir=/var/cache/yum/$basearch/$releasever ...