iOS 三种类型的Block
Block 的copy 操作
Block 其实来讲有三种类型
全局块 NSConcreteGlobalBlock
栈块 NSConcreteStackBlock
堆块 NSConcreteMallocBlock
全局块存储在全局内存中,相当于单例
栈块存于栈内存中,超出其作用域则马上进行销毁
堆块存在于堆内存中,是带一个引用计数的对象,需要自己进行内存管理
1> Block 不访问外界变量(包括堆中和栈中的变量)
既不存在栈又不在堆中,在代码段中ARC和MRC下都是如此,此时为全局块。
2 > Block 访问外界变量
ARC 环境下:访问外界变量的 Block 默认存储在堆中(实际是放在栈区,然后ARC情况下自动又拷贝到堆区),自动释放。
自己的理解:
至于为什么要用copy 修饰 block,说直白一点,就是为了延长block 的生命周期,我们使用的block 本身是存在于栈上的,如果不适用copy,函数调用结束的时候,block 就会被销毁。
函数调用结束,调用函数开辟的栈内存就会被回收,保存在函数栈上的block 自然而然就被销毁了,我们再使用的时候,就会空指针异常。
如果是堆中的block,也就是copy 的 block,他的生命周期是随着对象的销毁而结束的,只要对象不销毁,我们就可以调用到堆中的block。
@interface ViewController ()
// 定义一个block
@property (nonatomic,copy)void(^myBlock)(void);@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.//1 全局块 存储在代码区 NSConcreteGlobalBlock// 不访问外部的变量就是全局块void (^myBlock1)(void) = ^() {NSLog(@"全局块");};myBlock1();NSLog(@"%@",myBlock1);//2 存储在栈区域 访问外部变量, 但是没有进行copy,函数作用域结束// NSConcreteStackBlockint q = 15;void(^myBlock2)(void) = ^(){NSLog(@"栈块 --%d",q);};myBlock2();NSLog(@"%@",myBlock2);//3 堆块// NSConcreteMallocBlockint p = 25;void(^myBlock3)(void) = ^(){NSLog(@"堆块--%d",p);};// 进行一次copy 操作[myBlock3 copy];myBlock3();NSLog(@"%@",[myBlock3 copy]);[self test];// 到这一行 test 函数中所有存储在栈区的变量都会进行销毁,如果myBlock 使用// assign 进行修饰的话,没有把block copy到堆内存中的话,在下面的代码再进行访问的话,就会造成问野指针访问. EXC_BAD_ACCESS 错误// 所以要使 copy 属性进行修饰self.myBlock();
}- (void)test
{int a = 10;[self setMyBlock:^{NSLog(@"myblock--%d",a);}];NSLog(@"test--%@",self.myBlock);}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}
iOS 三种类型的Block相关推荐
- ios 开发者证书付费三种类型区别
ios 开发者证书付费三种类型区别 苹果开发者账号分为 个人(individual),公司(company),企业(enterprise)三种类型. 1.个人开发者账号: (1)费用:99美元每年. ...
- Asp.net支持三种类型的cache[转]
from:http://www.cnblogs.com/thomasnet/archive/2006/11/26/573104.html Asp.net支持三种类型的cache 想写一个技术快速概述, ...
- html5中标签分为,HTML标签的三种类型
HTML标签的类型分为三种:行内元素,行内块元素,块级元素 而标签的属性是可以转换的 display:inline: 转换为行内元素 display:linline-block 转换为行内块元素 di ...
- java中三种转string的方法_java中int,char,string三种类型的相互转换
如何将字串 String 转换成整数 int? int i = Integer.valueOf(my_str).intValue(); int i=Integer.parseInt(str); 如何将 ...
- java中有scoreframe类型嘛_java构造函数的三种类型总结
我们说构造函数能处理参数的问题,但其实也要分三种情况进行讨论.目前有三种类型:无参.有参和默认.根据不同的参数情况,需要我们分别进行构造函数的讨论.这里重点是无参构造函数的初始化也要分两种方法进行分析 ...
- mysql varchar,bigint,char三种类型性能的比较
mysql varchar,bigint,char三种类型性能的比较 比较数据类型的性能好坏,数据表必须有足够的数据,我用25万条数据做测试 字段是手机号,用这三个类型哪个类型好呢.首先分析手机号有1 ...
- mysql double 转 字符串_没想到!在MySQL数据库中的数据有这三种类型!
MySQL数据库是一个或多个数据列构成二维表,它的每一种数据列都有特定类型,而类型决定MySQL是怎么看待该列数据,如果把整型数值存放到字符类型的列中,MySQL则会把它当成字符串来处理. MySQL ...
- 辨别DVI接口连接线三种类型五种规格
DVI(Digital Visual Interface),即数字视频接口.它是1999年由Silicon Image.Intel(英特尔).Compaq(康柏).IBM.HP(惠普).NEC.Fuj ...
- mysql dbms是什么_DBMS体系结构的三种类型分别是什么
DBMS体系结构的三种类型分别是什么 发布时间:2020-12-05 13:27:28 来源:亿速云 阅读:129 作者:小新 这篇文章主要介绍了 DBMS体系结构的三种类型分别是什么,具有一定借鉴价 ...
最新文章
- 1.Redis简介与基本命令
- linux system更好方法,Linux将程序添加到服务的方法(通用【但最好还是用systemd】)...
- java math max_Java Math类静态double max(double d1,double d2)示例
- c语言操作目录,c语言中目录及文件操作.doc
- webform快速创建表单内容文件--oracle 数据库
- 初学Oracle的一点心得
- 苹果软件App上架问题
- ps色板文件怎么导入?
- 如何拼局域网所有ip_如何查看局域网内所有ip?
- Android开发Linux shell命令
- amd编码器 hevc_HEVC/H.265硬件编码器实现杂谈
- java 图片 文字居中_完美实现文字图片水平垂直居中
- arm 开发环境搭建-基于QEMU和Docker
- 0元参会丨第十届数据技术嘉年华精彩抢先速览
- 相思赋予谁 --知错
- STM32F103定时器详解
- 【博学谷学习记录】超强总结,用心分享|产品经理需求分析方法简析
- Python 随机数的产生
- python strip_关于python中strip方法的理解
- 前端开发工具HbuilderX的使用技巧