ARC之解决对象之间的循环强引用(Swift)
来源:互联网 发布:网络电视机盒 编辑:程序博客网 时间:2024/06/02 07:30
直接上代码,具体看代码中的注释
//// ViewController.swift// Refrence//// Created by Mac on 8/24/15.// Copyright © 2015 fevershen. All rights reserved.//import UIKitclass ViewController: UIViewController { // 解决对象之间的循环强引用造成的内存泄漏 // 1.弱引用, 2.无主引用, 3.无主引用以及显示展开(隐式解析)的可选属性 override func viewDidLoad() { super.viewDidLoad() // var john: Person// var number73: Apartment// john = Person(name: "John Appleseed")// number73 = Apartment(number: 73)// john.apartment = number73// number73.tenant = john// // var lina: Customer?// lina = Customer(name: "Lina Appleseed")// lina!.card = CreditCard(number: 1234_5678_9012_3456, customer: lina!) let country = Country(name: "Canada", captialName: "Ottawa") print("\(country.name)'s capital city is called \(country.capitalCity.name)") // 可选类型并不会自动初始化为 nil, 因此,使用前必须赋值 let str: String? = nil if (str != nil) { print("===" + str!) } else { print("---") } } // 1. // 人和公寓的关系都是可选的, 这里用 weak 就可以了 class Person { var name: String init (name: String) { self.name = name print("\(name) init") } var apartment: Apartment? deinit { print("\(name) deinit") } } class Apartment { let number: Int init (number: Int) { self.number = number print("Apartment \(number) init") } // 都不加 weak 将形成循环强引用,两个都不能被析构 weak var tenant: Person? deinit { print("Apartment \(number) deinit") } } // 2. // 客户的信用卡是可选的,但是信用卡必须要有客户(非可选),因此这里要用到 unowner class Customer { let name: String var card: CreditCard? init(name: String) { self.name = name print("Customer \(name) init") } deinit { print("Customer \(name) deinit") } } class CreditCard { let number: Int // 卡必须有主人, 无主引用是永远有值的 unowned let customer: Customer init(number: Int, customer: Customer) { self.number = number self.customer = customer print("CreditCard #\(number) init") } deinit { print("CreditCard #\(number) deinit") } } // 3. class Country { let name: String // 可选类型并不会自动初始化为 nil, 因此,使用前必须赋值 // 这里的意义在于通过一条语句同时创建两个实例 var capitalCity: City! = nil init(name: String, captialName: String) { print("Country is initing") self.name = name // 下面这条语句是将 Country 的实例做为参数传递给 City 来创建 City 的实例,表面上看 Country 本身还没有实例完成,实际上由于该类中 City 的属性为加 ! 的方式,因此,一旦 Country 的实例在构造函数中给 name 属性赋值,整个初始化过程就完成了,下面的打印信息为虚的 self.capitalCity = City(name: captialName, country: self) print("Country is inited") } deinit { print("Country is deinited") } } class City { let name: String unowned let country: Country init(name: String, country: Country) { print("City is initing") self.name = name self.country = country print("City is inited") } deinit { print("City is deinited") } }}
3.打印结果:
Country is initing
City is initing
City is inited
Country is inited
Canada's capital city is called Ottawa
---
Country is deinited
City is deinited
0 0
- ARC之解决对象之间的循环强引用(Swift)
- ARC之解决闭包引起的循环强引用
- swift语言基础之:subscript下标、对象之间的循环强引用的处理方法
- swift学习笔记(14)- 解决循环强引用
- Swift内存管理(ARC)之循环引用
- swift 循环强引用
- 14.6 Swift中weak解决循环强引用
- 14.7 Swift中unowned解决循环强引用
- 15.9 Swift解决闭包引起的循环强引用问题
- swift中解决循环引用的方法
- ARC之对象之间的转换
- Block的引用循环问题 (ARC & non-ARC) 【 引用外部变量或对象 】
- ARC与非ARC的循环引用
- swift之block的循环引用
- Swift 解决循环引用问题
- swift之闭包循环引用问题及解决方式
- ARC机制下的循环引用【结合非ARC引用】
- 解决swift中闭包中循环引用self 的问题
- 5、教你透彻了解红黑树
- 【POJ 2031】 Building a Space Station (三维坐标求距离+最小生成树)
- javah 错误: 找不到 'XXX' 的类文件。
- 使用springMVC的详细步骤
- StringBuffer应用
- ARC之解决对象之间的循环强引用(Swift)
- Alcatraz:管理Xcode插件
- JS 控制小数位数的实现代码
- Echarts制作报表-Struts2与之交互
- yii2 Event
- 城市计算与大数据
- jQuery Event.preventDefault() 函数详解
- EL表达式—获取request里的参数写法
- C++11(及现代C++风格)和快速迭代式开发