Swift基础篇——内存相关
来源:互联网 发布:qq采集软件 编辑:程序博客网 时间:2024/06/16 16:14
内存相关
import Foundation/*Swift内存管理:管理引用类型的内存, 不会管理值类型, 值类型不需要管理内存管理原则: 当没有任何强引用指向对象, 系统会自动销毁对象(默认情况下所有的引用都是强引用)如果做到该原则: ARC*/class Person { var name:String init(name:String){ self.name = name } deinit{ print("deinit") }}var p:Person? = Person(name: "Swift")//p = nil/*weak弱引用*/class Person2 { var name:String init(name:String){ self.name = name } deinit{ print("deinit") }}// 强引用, 引用计数+1var strongP = Person2(name: "Swift") // 1var strongP2 = strongP // 2// 弱引用, 引用计数不变// 如果利用weak修饰变量, 当对象释放后会自动将变量设置为nil// 所以利用weak修饰的变量必定是一个可选类型, 因为只有可选类型才能设置为nilweak var weakP:Person2? = Person2(name: "Swift")if let p = weakP{ print(p)}else{ print(weakP)}/*unowned无主引用 , 相当于OC unsafe_unretainedunowned和weak的区别: 1.利用unowned修饰的变量, 对象释放后不会设置为nil. 不安全 利用weak修饰的变量, 对象释放后会设置为nil2.利用unowned修饰的变量, 不是可选类型 利用weak修饰的变量, 是可选类型什么时候使用weak?什么时候使用unowned?*/class Person3 { var name:String init(name:String){ self.name = name } deinit{ print("deinit") }}unowned var weakP3:Person3 = Person3(name: "Swift")/*循环引用ARC不是万能的, 它可以很好的解决内存问题, 但是在某些场合不能很好的解决内存泄露问题例如两个或多个对象之间的循环引用问题*/class Person4 { let name:String // 姓名 // 人不一定有公寓 weak var apartment: Apartment? // 公寓 init(name:String){ self.name = name } deinit{ print("\(self.name) deinit") }}class Apartment { let number: Int // 房间号 var tenant: Person4? // 租客 init(number:Int){ self.number = number } deinit{ print("\(self.number) deinit") }}var p4:Person4? = Person4(name: "Swift")var a4:Apartment? = Apartment(number:888)p4!.apartment = a4 // 人有一套公寓a4!.tenant = p4! // 公寓中住着一个人// 两个对象没有被销毁, 但是我们没有办法访问他们了. 内存泄露p4 = nila4 = nilclass Person5 { let name:String // 姓名 // 人不一定有信用卡 var card: CreditCard? init(name:String){ self.name = name } deinit{ print("\(self.name) deinit") }}class CreditCard{ let number: Int // 信用卡必须有所属用户 // 当某一个变量/常量必须有值, 一直有值, 那么可以使用unowned修饰 unowned let person: Person5 init(number:Int, person: Person5){ self.number = number self.person = person } deinit{ print("\(self.number) deinit") }}var p5:Person5? = Person5(name: "Swift")var cc:CreditCard? = CreditCard(number: 8888888, person: p5!)p5 = nilcc = nil
0 0
- Swift基础篇——内存相关
- Swift基础篇——元祖
- Swift基础篇——分支
- Swift基础篇——可选类型
- Swift基础篇——循环
- Swift基础篇——数组
- Swift基础篇——字典
- Swift基础篇——字符串
- Swift基础篇——函数
- Swift基础篇——构造函数
- Swift基础篇——闭包
- Swift基础篇——懒加载
- Swift基础篇——单例
- Swift基础篇——结构体
- Swift基础篇——可选值
- Swift基础篇——枚举
- Swift基础篇——内外函数
- Swift开发基础篇—基本语法
- Ember.js 入门指南——查询记录
- Swift基础篇——结构体
- POJ 1159 Palindrome
- Swift基础篇——可选值
- Swift基础篇——枚举
- Swift基础篇——内存相关
- Swift基础篇——内外函数
- Swift基础篇——析构方法
- [POJ 1511]Invitation Cards[链式前向星][SPFA]
- java 虚拟机的生命周期
- Swift2.0——构造方法的使用
- Josephus问题解决方法一
- Swift中的打印日志的配置
- 关于大学考试的一点看法