Swift基础篇——内存相关

Swift基础篇——内存相关,第1张

概述内存相关 import Foundation/* Swift内存管理: 管理引用类型的内存, 不会管理值类型, 值类型不需要管理 内存管理原则: 当没有任何强引用指向对象, 系统会自动销毁对象 (默认情况下所有的引用都是强引用) 如果做到该原则: ARC */class Person { var name:String init(name:String){ s 内存相关
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基础篇——内存相关所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1083540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存