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){ "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_unretained uNowned和weak的区别: 1.利用uNowned修饰的变量,对象释放后不会设置为nil. 不安全 利用weak修饰的变量,对象释放后会设置为nil 2.利用uNowned修饰的变量,不是可选类型 利用weak修饰的变量,是可选类型 什么时候使用weak? 什么时候使用uNowned? */class Person3 { var name:String init(name:String){ "deinit") }}uNowned var weakP3:Person3 = Person3(name: "Swift")/* 循环引用 ARC不是万能的,它可以很好的解决内存问题,但是在某些场合不能很好的解决内存泄露问题 例如两个或多个对象之间的循环引用问题 */class Person4 { let name:String // 姓名 // 人不一定有公寓 weak var apartment: Apartment? // 公寓 init(name:String){ "\(self.name) deinit") }}class Apartment { let number: Int // 房间号 var tenant: Person4? // 租客 init(number:Int){ .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 // 人不一定有xyk var card: CreditCard? init(name:String){ "\(self.name) deinit") }}class CreditCard{ let number: Int // xyk必须有所属用户 // 当某一个变量/常量必须有值,一直有值,那么可以使用uNowned修饰 uNowned let person: Person5 init(number:Int,person: Person5){ .number = number .person = person } deinit{ print("\(self.number) deinit") }}var p5:Person5? = Person5(name: "Swift")var cc:CreditCard? = CreditCard(number: 8888888,person: p5!)p5 = nilcc = nil总结
以上是内存溢出为你收集整理的Swift基础篇——内存相关全部内容,希望文章能够帮你解决Swift基础篇——内存相关所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)