block使用小结在arc中使用block如何防止循环引用.docxVIP

block使用小结在arc中使用block如何防止循环引用.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
block使用小结在arc中使用block如何防止循环引用

引言使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试/bbs/read.php?tid=152222主题:?【小测试】你真的知道blocks在Objective-C中是怎么工作的吗?,发现竟然做错了几道,?才知道自己想当然的理解是错误的,所以抽时间学习了下,并且通过一些测试代码进行测试,产生这篇博客。Block简介(copy一段)Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事。需要注意的是由于Objective-C在iOS中不支持GC机制,使用Block必须自己管理内存,而内存管理正是使用Block坑最多的地方,错误的内存管理?要么导致return cycle内存泄漏要么内存被提前释放导致crash。?Block的使用很像函数指针,不过与函数最大的不同是:Block可以访问函数以外、词法作用域以内的外部变量的值。换句话说,Block不仅 实现函数的功能,还能携带函数的执行环境。可以这样理解,Block其实包含两个部分内容Block执行的代码,这是在编译的时候已经生成好的;一个包含Block执行时需要的所有外部变量值的数据结构。?Block将使用到的、作用域附近到的变量的值建立一份快照拷贝到栈上。Block与函数另一个不同是,Block类似ObjC的对象,可以使用自动释放池管理内存(但Block并不完全等同于ObjC对象,后面将详细说明)。Block基本语法基本语法在本文就不赘述了,同学们自学。Block的类型与内存管理根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock。NSGlobalBlock:类似函数,位于text段;NSStackBlock:位于栈内存,函数返回后Block将无效;NSMallocBlock:位于堆内存。1、NSGlobalBlock如下,我们可以通过是否引用外部变量识别,未引用外部变量即为NSGlobalBlock,可以当做函数使用。123456789{?//create a NSGlobalBlock?float?(^sum)(float,?float) = ^(float?a,?float?b){??return?a + b;?};??NSLog(@block is %@, sum);?//block is __NSGlobalBlock__: 0x47d0}2、NSStackBlock如下:1234567891011121314151617181920{?NSArray?*testArr = @[@1,?@2];??void?(^TestBlock)(void) = ^{??NSLog(@testArr :%@, testArr);?};??NSLog(@block is %@, ^{??NSLog(@test Arr :%@, testArr);?});?//block is __NSStackBlock__: 0xbfffdac0?//打印可看出block是一个?NSStackBlock,?即在栈上,?当函数返回时block将无效??NSLog(@block is %@, TestBlock);?//block is __NSMallocBlock__: 0x75425a0?//上面这句在非arc中打印是?NSStackBlock,?但是在arc中就是NSMallocBlock?//即在arc中默认会将block从栈复制到堆上,而在非arc中,则需要手动copy.}3、NSMallocBlock只需要对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操作都无效;NSStackBlock:retain、release操作无效,必须注意的是,NSStackBlock在函数返回后,Block内存将被回收。即使retain也没用。容易犯的错误是[[mutableAarry addObject:stackBlock],(补:在arc中不用担心此问题,因为arc中会默认将实例化的block拷贝到堆上)在函数出栈后,从mutableAarry中取到的stackBlock已经

文档评论(0)

kakaxi + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档