Swift 自动引用计数(ARC).pdfVIP

  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文档。上传文档
查看更多
Swift 自动引用计数(ARC)

Swift ⾃动引⽤计数 (ARC) Swift ⾃动引⽤计数 (ARC) Swift 使⽤⾃动引⽤计数 (ARC )这⼀机制来跟踪和管理应⽤程序的内存 通常情况下我 不需要去⼿动释放内存,因为 ARC 会在类的实例不再被使⽤时,⾃ 动释放其占⽤的内存。 但在有些时候我 还是需要在代码中实现内存管理。 ARC 功能 当每次使⽤ init() ⽅法创建⼀个类的新的实例的时候,ARC 会分配⼀⼤块内存 ⽤来储存实例的信息。 内存中会包含实例的类型信息,以及这个实例所有相关属性的值。 当实例不再被使⽤时,ARC 释放实例所占⽤的内存,并让释放的内存能挪作他 ⽤。 为了确保使⽤中的实例不会被销毁,ARC 会跟踪和计算每⼀个实例正在被多少 属性,常量和变量所引⽤。 实例赋值给属性、常量或变量,它 都会创建此实例的强引⽤,只要强引⽤还 在,实例是不允许被销毁的。 ARC 实例 class Person { let name: String init(name: String) { = name print(\(name) 开始初始化) } deinit { print(\(name) 被析构) } } // 值会被⾃动初始化为nil,⽬前还不会引⽤到Person类的实例 var reference1: Person? var reference : Person? var reference3: Person? // 创建Person类的新实例 reference1 = Person(name: W3CSchool) //赋值给其他 个变量,该实例⼜会多出 个强引⽤ reference = reference1 reference3 = reference1 //断开第⼀个强引⽤ reference1 = nil //断开第⼆个强引⽤ reference = nil //断开第三个强引⽤,并调⽤析构函数 reference3 = nil 以上程序执⾏输出结果为: W3CSchool 开始初始化 W3CSchool 被析构 类实例之间的循环强引⽤ 在上⾯的例⼦中,ARC 会跟踪你所新创建的 Person 实例的引⽤数量,并且会在 Person 实例不再被需要时销毁它。 然⽽,我 可能会写出这样的代码,⼀个类永远不会有0个强引⽤。这种情况发⽣在 两个类实例互相保持对⽅的强引⽤,并让对⽅不被销毁。这就是所谓的循环强引⽤。 实例 下⾯展⽰了⼀个不经意产⽣循环强引⽤的例⼦。例⼦定义了两个类:Person和 Apartment ,⽤来建模公寓和它其中的居民: class Person { let name: String init(name: String) { = name } var apartment: Apartment? deinit { print(\(name) 被析构) } } class Apartment { let number: Int init(number: Int) { self.number = number } var tenant: Person? deinit { print(Apartment #\(number) 被析构) } } // 个变量都被初始化为nil var youj: Person? var number73: Apartment? // 赋值 youj = Person(name: W3CSchool) number73 = Apartment(number: 73) // 意感叹号是⽤来展开和访问可选变量 youj 和 number73 中的实例 // 循环强引⽤被创建 youj!.apartment = number73 number73!.tenant = youj // 断开 youj 和 number73 变量所持有的强引⽤时,引⽤计数并不会降为 0,实例也 // 注意,当你把这 个变量设为nil时,没有任何⼀个析构函数被调⽤。 // 强引⽤循环阻⽌了Person和Apartment类实例的销毁,并在你的应⽤程序中造成了内 youj = nil number73 = nil 解决实例之间的循环强引⽤ Swif

文档评论(0)

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

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

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档