block使用小结、在arc中使用block、如何防止循环引用文档推荐

上传人:粗**** 文档编号:135281555 上传时间:2020-06-14 格式:PDF 页数:4 大小:45.44KB
返回 下载 相关 举报
block使用小结、在arc中使用block、如何防止循环引用文档推荐_第1页
第1页 / 共4页
block使用小结、在arc中使用block、如何防止循环引用文档推荐_第2页
第2页 / 共4页
block使用小结、在arc中使用block、如何防止循环引用文档推荐_第3页
第3页 / 共4页
block使用小结、在arc中使用block、如何防止循环引用文档推荐_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《block使用小结、在arc中使用block、如何防止循环引用文档推荐》由会员分享,可在线阅读,更多相关《block使用小结、在arc中使用block、如何防止循环引用文档推荐(4页珍藏版)》请在金锄头文库上搜索。

1、引言 使用 block 已经有一段时间了 感觉自己了解的还行 但是几天前看到CocoaChina 上一个关于 block 的小测试 发现竟然做错了几道 才知道自己想当然的理解是错误的 所以抽时间学习了 下 并且通过一些测试代码进行测试 产生这篇博客 Block 简介 copy 一段 Block 作为 C 语言的扩展 并不是高新技术 和其他语言的闭包或lambda 表达式是一回事 需 要注意的是由于Objective C 在 iOS中不支持 GC 机制 使用Block 必须自己管理内存 而内存管 理正是使用Block 坑最多的地方 错误的内存管理要么导致return cycle 内存泄漏要么内存

2、被提 前释放导致crash Block 的使用很像函数指针 不过与函数最大的不同是 Block 可以访问函数 以外 词法作用域以内的外部变量的值 换句话说 Block 不仅 实现函数的功能 还能携带函 数的执行环境 可以这样理解 Block 其实包含两个部分内容 1 Block 执行的代码 这是在编译的时候已经生成好的 2 一个包含Block 执行时需要的所有外部变量值的数据结构 Block 将使用到的 作用域 附近到的变量的值建立一份快照拷贝到栈上 Block 与函数另一个不同是 Block 类似 ObjC 的对象 可以使用自动释放池管理内存 但Block 并不完全等同于ObjC 对象 后面

3、将详细说明 Block 基本语法 基本语法在本文就不赘述了 同学们自学 Block 的类型与内存管理 根据 Block 在内存中的位置分为三种类型NSGlobalBlock NSStackBlock NSMallocBlock NSGlobalBlock 类似函数 位于text 段 NSStackBlock 位于栈内存 函数返回后Block 将无效 NSMallocBlock 位于堆内存 1 NSGlobalBlock 如下 我们可以通过是否引用外部变量识别 未引用外部变量即为 NSGlobalBlock 可以当做函数使用 1 2 3 4 5 6 7 8 9 3 NSMallocBlock 只

4、需要对NSStackBlock 进行 copy 操作就可以获取 但是retain 操作就不行 会 在下面说明 Block 的 copy retain release 操作 还是 copy 一段 不同于 NSObjec 的 copy retain release 操作 Block copy 与 copy 等效 Block release 与 release 等效 对 Block 不管是 retain copy release 都不会改变引用计数retainCount retainCount 始 终是 1 NSGlobalBlock retain copy release 操作都无效 NSStac

5、kBlock retain release 操作无效 必须注意的是 NSStackBlock 在函数返回后 Block 内存将被回收 即使retain 也没用 容易犯的错误是 mutableAarry addObject stackBlock 补 在arc 中不用担心此问题 因为arc 中会默认将实例化的 block 拷贝到堆上 在函数出栈后 从mutableAarry 中取到的stackBlock 已经被回收 变 成了野指针 正确的做法是先将stackBlock copy 到堆上 然后加入数组 mutableAarry addObject stackBlock copy autoreleas

6、e 支持 copy copy 之后生成新的NSMallocBlock 类型对象 NSMallocBlock 支持 retain release 虽然 retainCount 始终是 1 但内存管理器中仍然 会增加 减少计数 copy 之后不会生成新的对象 只是增加了一次引用 类似retain 尽量不要对Block 使用 retain 操作 Block 对外部变量的存取管理 基本数据类型 1 局部变量 局部自动变量 在Block 中只读 Block 定义时 copy 变量的值 在Block 中作为常量使用 所以 即使变量的值在Block 外改变 也不影响他在Block 中的值 1 2 3 4 5

7、 6 7 8 9 10 11 int base 100 long sum int int long int a int b return base a b base 0 printf ld n sum 1 2 1 2 3 4 5 6 7 8 9 10 static int base 100 long sum int int long int a int b base return base a b base 0 printf ld n sum 1 2 11 12 13 In ARC mode block id x defaults to retaining x just like all ot

8、her values To get the manual reference counting mode behavior under ARC you could use unsafe unretained block id x As the name unsafe unretained implies however having a non retained variable is dangerous because it can dangle and is therefore discouraged Two better options are to either use weak if you don t need to support iOS 4 or OS X or set the block value to nilto break the retain cycle 致力于 ios 开发 分类

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号