swiet中的引用关系说明.docxVIP

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

SWIFT中的引用关系说明我发现自己写代码的时候经常担心强引用循环(retain cycles)的出现。我觉得这个和其他问题一样比较常见。不知道你是什么情况,我反正总是听见我什么时候要用关键词weak?unowned这坨东西到底是啥玩意儿?这类声音。我们发现的问题是我们知道在swift代码中要去用strong,weak和unowned说明符来避免强引用循环,但是我们不大了解具体用哪一个。好在我知道它们是啥,还知道啥时候去用他们!希望这篇文章能教会你知道什么时候,并且在哪里用这3个说明符。咱们开始吧ARCARC是自动内存管理Apple版本的一个编译时特性(compile time feature)。全称是Automatic Reference Counting。意思是对于一个对象来说,只有在没有任何强引用指向它时,该对象占用的内存才会被回收。STRONG - 强引用从什么是强引用说起。它本质上是一个普通的引用(指针或者其他有相同意思的东西),但是它特殊在能够通过将该引用指向对象(object)的保留计数(retain count)增加1来保护这个对象不被ARC回收。实质上,哪怕任何一个东西的一个强引用指向了这个对象,这个对象就不会被回收。记住这点,待会儿讲强引用循环和相关东西的时候会用到。强引用在swift中几乎随处可见。实际上声明一个属性(property)的时候默认就是一个强引用。通常在关系层级是线性的时候用强引用问题不大。当强引用从父层级流向子层级的时候,这个强引用的使用总是没问题。这有个强引用的例子。class?Kraken?{?let?tentacle=Tentacle()?//对子层级的强引用。?}?class?Tentacle?{??let?sucker=Sucker()//对子层级的强引用。?}?class?Sucker{}??*/Kraken的意思是海妖,Tentacle的意思是触手,sucker的意思是吸盘...译者注/*?例子中是一个线性的关系层级。Kraken有一个指向Tentacle实例的强引用,Tentacle实例又有一个指向Sucker实例的强引用。引用关系的流向从父层级(Kraken)一直向下流到子层级(Sucker)。在animation block里引用层级也是类似的:UIView.animateWithDuration(0.3)?{??self.view.alpha=0.0?}?因为animateWithDuration是UIView的一个静态方法,这里的闭包是父层级,self是子层级。如果子层级想引用父层级怎么办?这就是我们要用弱引用和unowned引用的地方。WEAK AND UNOWNED REFERENCES - 弱引用和UNOWNED引用WEAK - 弱引用弱引用就是一个保护不了其所指对象不被ARC回收的指针。强引用能让它对象的保留计数增加1,弱引用不能。swift中,所有的弱引用都是非常量的可选类型(non-constant Optionals)(想一下var和let的关系),因为在没有其他强引用指向的时候,这个引用能,并且会被改变成nil。例如下面的代码就不能通过编译:class?Kraken?{??weak?let?tentacle?=?Tentacle()?//let是一个常量。所有的weak变量都必须是可变(mutable)的。?}?因为tentacle是一个let常量。Let由于规范限制使得其在运行时不能够被改变。因为弱引用变量(weak variables)在没有任何强引用指向它们时是会被改变成nil的,所以swift编译器要求你将弱引用变量声明成var。那些会出现潜在的强引用循环的地方就是使用弱引用变量的关键之处。强引用循环发生在两个对象彼此之间都用强引用指向对方的情况下,ARC不会对其中任何一个实例发出正确的释放信号代码(release message code),因为这两个实例正彼此保护着对方。这有个来自Apple的简洁图片,非常明了的展示了这点:下面是一个能展示强引用循环的很棒的例子,其中用到了NSNotification API(还是比较新的API)。看看下面的代码吧:class?Kraken?{??var?notificationObserver:?((NSNotification)?-?Void)????init()?{notificationObserver?=?NSNotificationCenter.defaultCenter().addObserverForName(humanEnteredKrakensLair,?object:?nil,?queue:?NSOperationQueue.mainQueue())?{?notification?i

文档评论(0)

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

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

1亿VIP精品文档

相关文档