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相关推荐

  1. ios 开发者证书付费三种类型区别

    ios 开发者证书付费三种类型区别 苹果开发者账号分为 个人(individual),公司(company),企业(enterprise)三种类型. 1.个人开发者账号: (1)费用:99美元每年. ...

  2. Asp.net支持三种类型的cache[转]

    from:http://www.cnblogs.com/thomasnet/archive/2006/11/26/573104.html Asp.net支持三种类型的cache 想写一个技术快速概述, ...

  3. html5中标签分为,HTML标签的三种类型

    HTML标签的类型分为三种:行内元素,行内块元素,块级元素 而标签的属性是可以转换的 display:inline: 转换为行内元素 display:linline-block 转换为行内块元素 di ...

  4. java中三种转string的方法_java中int,char,string三种类型的相互转换

    如何将字串 String 转换成整数 int? int i = Integer.valueOf(my_str).intValue(); int i=Integer.parseInt(str); 如何将 ...

  5. java中有scoreframe类型嘛_java构造函数的三种类型总结

    我们说构造函数能处理参数的问题,但其实也要分三种情况进行讨论.目前有三种类型:无参.有参和默认.根据不同的参数情况,需要我们分别进行构造函数的讨论.这里重点是无参构造函数的初始化也要分两种方法进行分析 ...

  6. mysql varchar,bigint,char三种类型性能的比较

    mysql varchar,bigint,char三种类型性能的比较 比较数据类型的性能好坏,数据表必须有足够的数据,我用25万条数据做测试 字段是手机号,用这三个类型哪个类型好呢.首先分析手机号有1 ...

  7. mysql double 转 字符串_没想到!在MySQL数据库中的数据有这三种类型!

    MySQL数据库是一个或多个数据列构成二维表,它的每一种数据列都有特定类型,而类型决定MySQL是怎么看待该列数据,如果把整型数值存放到字符类型的列中,MySQL则会把它当成字符串来处理. MySQL ...

  8. 辨别DVI接口连接线三种类型五种规格

    DVI(Digital Visual Interface),即数字视频接口.它是1999年由Silicon Image.Intel(英特尔).Compaq(康柏).IBM.HP(惠普).NEC.Fuj ...

  9. mysql dbms是什么_DBMS体系结构的三种类型分别是什么

    DBMS体系结构的三种类型分别是什么 发布时间:2020-12-05 13:27:28 来源:亿速云 阅读:129 作者:小新 这篇文章主要介绍了 DBMS体系结构的三种类型分别是什么,具有一定借鉴价 ...

最新文章

  1. 1.Redis简介与基本命令
  2. linux system更好方法,Linux将程序添加到服务的方法(通用【但最好还是用systemd】)...
  3. java math max_Java Math类静态double max(double d1,double d2)示例
  4. c语言操作目录,c语言中目录及文件操作.doc
  5. webform快速创建表单内容文件--oracle 数据库
  6. 初学Oracle的一点心得
  7. 苹果软件App上架问题
  8. ps色板文件怎么导入?
  9. 如何拼局域网所有ip_如何查看局域网内所有ip?
  10. Android开发Linux shell命令
  11. amd编码器 hevc_HEVC/H.265硬件编码器实现杂谈
  12. java 图片 文字居中_完美实现文字图片水平垂直居中
  13. arm 开发环境搭建-基于QEMU和Docker
  14. 0元参会丨第十届数据技术嘉年华精彩抢先速览
  15. 相思赋予谁 --知错
  16. STM32F103定时器详解
  17. 【博学谷学习记录】超强总结,用心分享|产品经理需求分析方法简析
  18. Python 随机数的产生
  19. python strip_关于python中strip方法的理解
  20. 前端开发工具HbuilderX的使用技巧

热门文章

  1. RAP Mock.js语法规范
  2. 用自定义方法,传入成绩数组,实现输出考试成绩的成三名
  3. Laravel Predis Error while reading line from the server.
  4. POJ1022 Packing Unit 4D Cubes
  5. 年年英雄会,岁岁侠客行
  6. 正则式高人谈解答正则式的心得
  7. 在c#中调用windows脚本的方法
  8. Java字节码instrument研究
  9. 一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现2
  10. C和C++安全编码笔记:整数安全