import UIKit/*
class Person {let name: String//强引用init(name: String) {self.name = nameprint("\(name) is being initialized")}//引用计数销毁时deinit {print("\(name) is being deinitialized")}
}
*/class Person {let name: Stringinit(name: String) { self.name = name }var apartment: Apartment?deinit { print("\(name) is being deinitialized") }
}
class Apartment {let unit: Stringinit(unit: String) { self.unit = unit }
//    var tenant: Person?
weak var tenant: Person? //弱引用deinit { print("Apartment \(unit) is being deinitialized") }
}class First_Demo2: UIViewController {//    var reference1: Person?
//    var reference2: Person?
//    var reference3: Person?
    var john: Person?var unit4A: Apartment?var johnnn: Customer?override func viewDidLoad() {super.viewDidLoad()self.navigationItem.title = "自动引用计数"self.view.backgroundColor = UIColor.white//        let person = Person(name:"wangyalu")//reference1 = Person(name: "John Appleseed")//John Appleseed is being initialized//在你清楚地表明不再使用这个 Person 实例,强引用被断开时,ARC 会销毁它:
//        reference1 = nil//互为强引用john = Person(name:"wang")unit4A = Apartment(unit:"4A")// Person 实例现在有了一个指向 Apartment 实例的强引 用,而 Apartment 实例也有了一个指向 Person 实例的强引用。因此,当你断开 john 和 unit4A 变量所持有的强 引用时,引用计数并不会降为 0 ,实例也不会被 ARC 销毁:
john!.apartment = unit4Aunit4A!.tenant = john//当你把这两个变量设为 nil 时,没有任何一个析构函数被调用。循环强引用会一直阻止 Person 和 Apartme nt 类实例的销毁,这就在你的应用程序中造成了内存泄漏。john = nilunit4A = nil//注意:/*在使用垃圾收 的系统里,弱指针有时用来实现简单的缓冲机制,因为没有强引用的对象只会在内存压力触发垃 圾收 时才被销毁。但是在 ARC 中,一旦值的最后一个强引用被移除,就会被立即销毁,这导致弱引用并不适 合上面的用途。*/johnnn = Customer(name: "John Appleseed")johnnn!.card = CreditCard(number: 1234_5678_9012_3456, customer: johnnn!)johnnn = nil// 打印 “John Appleseed is being deinitialized”// 打印 ”Card #1234567890123456 is being deinitialized”
    }/*Customer 实例持有对 CreditCard 实例的强引用,而 CreditCard 实例持有对 Customer 实例的无主引用。 由于 customer 的无主引用,当你断开 johnnn 变量持有的强引用时,再也没有指向 Customer 实例的强引用了:由于再也没有指向 Customer 实例的强引用,该实例被销毁了。其后,再也没有指向 CreditCard 实例的强引 用,该实例也随之被销毁了:*/class Customer {let name: Stringvar card: CreditCard?init(name: String) {self.name = name}deinit { print("\(name) is being deinitialized") }}class CreditCard {let number: UInt64unowned let customer: Customerinit(number: UInt64, customer: Customer) {self.number = numberself.customer = customer}deinit { print("Card #\(number) is being deinitialized") }}override func didReceiveMemoryWarning() {super.didReceiveMemoryWarning()// Dispose of any resources that can be recreated.
    }}

转载于:https://www.cnblogs.com/sayimba/p/6237240.html

swif-自动引用计数相关推荐

  1. Swift学习:自动引用计数

    swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存.通常情况下,swift 内存管理机制会一直起作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用 ...

  2. OC中的自动引用计数

    目录: 1,自动引用计数的定义 2,强引用和弱引用 3,类比手动引用 4,循环引用 5,CoreFoundation 内容: 自动引用计数的定义: (Automatic Reference Count ...

  3. iOS 自动引用计数和内存泄露

    自动引用计数与解决内存泄露 自动引用计数主要用于管理和释放内存. 引用计数 我们在创建一个对象的时候,系统会为其分配内存,而什么时候和谁来释放对象内存成了问题,如果不释放,就会导致内存不足.所以苹果公 ...

  4. swift_025(Swift 的自动引用计数(ARC)

    //***********swift学习之25--自动引用计数(ARC)--*************************** // 有了手动管理的概念的话,对于开发避免出现一些不易观察的问题,和 ...

  5. 【2015-10-19】内存管理---深浅拷贝,autorelease,ARC(自动引用计数)

    2019独角兽企业重金招聘Python工程师标准>>> 一.复习内存管理中的MRC(手动管理内存) 1.还是遵循谁retain,谁release的原则: 2.遛狗练习的中途换狗问题, ...

  6. Swift2.1 语法指南——自动引用计数

    原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...

  7. Swift中文教程(十六) 自动引用计数

    Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内 ...

  8. 关于oc中自动引用计数 小结

    1.自动引用计数 ARC(Automatic Reference Counting,自动引用计数)极大地减少了Cocoa开发中的常见编程错误:retain跟release不匹配.ARC并不会消除对re ...

  9. OC基础15:内存管理和自动引用计数

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...

  10. js 内存引用计数_快速内存管理–自动引用计数

    js 内存引用计数 In this tutorial, we'll be covering Swift memory management and learn about Automatic Refe ...

最新文章

  1. (0097)iOS开发之应用间的分享系列(2)
  2. RUNOOB python练习题12 找素数问题
  3. 上周热点回顾(6.5-6.11)
  4. LeetCode - 7 - Reverse Integer
  5. 纯CSS: hover特效
  6. web程序设计(2)....开发流程?
  7. 孙鑫VC学习笔记:第六讲 菜单
  8. 物联网应用中的数字孪生——一种实现物联网数字孪生的全面的解决方案
  9. 凤凰 Remix android x86,主流 Android x86系统分享
  10. 【原创】CentOS8最小化安装中系统命令,看你能认识几个
  11. Auto.js找图找色常用功能
  12. CentOS7升级MariaDB 10.2版本详细步骤
  13. centos7密码破解
  14. mybatis批量删除 java_Mybatis批量删除数据操作方法
  15. Hive on Hbase
  16. 23考研计算机:天津理工大学
  17. 学习这东西确实得稳扎稳打,勿焦勿躁
  18. 招商银行信用卡中心视频面试
  19. 详细的计算机存储层次结构图,必知必会-存储器层次结构
  20. Arch linux uefi 启动盘,用UEFI安装ArchLinux 20140105

热门文章

  1. oracle删除无效归档日志,求助:rman无法按照策略删除过期的归档日志
  2. mysql+永久+关闭提交,MySQL学习【第十一篇存储引擎之事务解释】
  3. spring logback mysql_logback 日志输出格式
  4. matplotlib绘图蓝本
  5. 用于精准判断的贝叶斯定理
  6. 【杂谈】有三AI秋季划火热进行中,如何深入学习模型优化,人脸算法,图像质量等研究方向...
  7. 全球及中国水刀机械行业发展态势及及投资决策建议报告2021年版
  8. jenkins报错Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password) 的处理
  9. shell脚本基本命令1
  10. PyCharm-缩进 格式化代码