- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 四川省雅安市2023-2024学年八年级下学期期末考试数学试题.docx VIP
- 《客厅精细化设计》课件.ppt VIP
- 2025中国银行中银国际证券股份有限公司招聘8人笔试模拟试题及答案解析.docx VIP
- 脊柱结核术后护理.pptx VIP
- 行政法与行政诉讼法 试卷及答案 多项选择题(同名48525).doc VIP
- 地铁车站客伤处理.pptx VIP
- 2025活跃用户研究报告小红书平台.pdf VIP
- 丙烯腈催化剂产品技术标准要求2023年.docx
- 互联网传媒行业市场前景及投资研究报告:小红书,头部内容社区.pdf VIP
- 小学信息技术(信息科技)五年级全一册义务教育版(2024)合集.docx
文档评论(0)