Objective-CiOS之Block深究.docVIP

  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文档。上传文档
查看更多
Objective-CiOS之Block深究

Objective-C iOS之Block深究   在了解Block之前,我们有必要先了解一下一些基础知识。   我们都知道,Objective-C是由C语言扩展而来的。在Objective-C中,引用是指向对象的一个指针。即引用是一个变量,也是一个指针,存储的是对象的地址。那么,引用本身其实也是存在地址的。所以引用和引用指向的对象是两个不同的概念。   1. 在Objective-C中,引用一般分为强引用类型和弱引用类型。即由__strong和__weak修饰的引用,不显式指定引用类型时,默认为__strong修饰的强引用类型。强引用会使指向的对象引用计数加1,而弱引用则不会,且弱引用在指向的对象被释放时,会被置为nil。   2. Block块分为定义时和运行时两种状态。定义时指的是Block块作为类进行编译处理和Block块作为对象进行创建的时候(Block块代码相当于对象方法),这个时候Block块还没有运行。运行时指的是Block块代码执行的时候。(此概念是为了理解Block而定义的,并不是官方定义的。)   3. 非局部引用指的是定义在Block块外的局部引用,但是在Block块中有该引用的作用域。   了解完这些基础知识后,我们就可以开始深入了解Block。这篇文章主要研究的是Block块的正确使用,以及为什么要这样使用,并不对Block的实现原理做深入了解。   首先,对于在Block块中使用非局部引用的情况,我们先看一下下面这个例子: NSString *string = @Smith; void(^block)() = ^(){ NSLog(@%@,string); }; string = @Jackyson; block();   我们知道,运行结果是Smith。那么,为什么会是这样呢?我们可以尝试的打印string引用的地址,注意,是string引用的地址,而不是string指向的对象的地址,两者是有很大的不同的。通过下面这个例子: NSString *string = @Smith; NSLog(@1-----string对象:%@,string引用的地址:%p,string,string); void(^block)() = ^(){ NSLog(@3-----string对象:%@,string引用的地址:%p,string,string); }; string = @Jackyson; NSLog(@2-----string对象:%@,string引用的地址:%p,string,string); block();  下面是我的运行结果: 2016-09-11 16:43:23.179 Block[73629:3669954] 1-----string对象:Smith,string引用的地址:0x7fff5e6f3a18 2016-09-11 16:43:23.179 Block[73629:3669954] 2-----string对象:Jackyson,string引用的地址:0x7fff5e6f3a18 2016-09-11 16:43:23.180 Block[73629:3669954] 3-----string对象:Smith,string引用的地址:0x7fca60c37260   从上面我们可以看到,在Block块内部的string和Block块外面定义的string是不一样的,它们是两个不同的引用,只是都指向了“Smith”这个字符串对象。   其实,在Block块内部通过非局部引用访问了外部对象时,因为非局部引用在当前作用域结束时会失效(外部对象会被回收),而为了Block在真正运行时能正确访问外部对象,所以在Block块定义时,会在Block块内部复制非局部引用定义一个内部引用(成员变量)。当非局部引用使用__block修饰,则内部引用是const修饰的引用,这意味着内部引用的值是不可改变的(无法指向新的对象)。反之没有使用__block修饰,则内部引用是没有const修饰的引用,这意味着内部引用的值是可以改变的(可以指向新的对象)。同时,内部引用和非局部引用的强弱类型一致。   让我们回到上面的例子中,在Block块中通过string访问了“Smith”对象,那么Block块定义时,会自动生成名称为string的内部引用(作用域在Block块内),且该指针的值不可修改(const),即引用不能指向新的对象,所以内部引用string一直指向字符串“Smith”。而非局部引用string指向新的字符串对象“Jackyson

文档评论(0)

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

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

1亿VIP精品文档

相关文档