18 自動引用計數(shù)

工作機制

  • Swift和OC一樣,采用自動引用計數(shù)來管理內(nèi)容
    • 當(dāng)有一個強引用指向某一個動向時,該對象的引用計數(shù)會自動+1
    • 當(dāng)該強引用消失時,引用計數(shù)會自動-1
    • 當(dāng)引用計數(shù)為0時,該對象會被銷毀

循環(huán)引用

  • 在通常情況下,ARC是會自動幫助我們管理內(nèi)存的
  • 但是在開發(fā)中我們經(jīng)常會出現(xiàn)循環(huán)引用的問題,比如下面的示例
    • Student對Book對象有一個強引用
    • 而Book對Student有一個強引用
    • 在兩個強指針都指向nil時,兩個對象的引用計數(shù)依然不為0,依然不會被銷毀,就形成了循環(huán)引用
// 1.創(chuàng)建類
class Student {
    var book : Book?

    deinit {
        print("Student -- deinit")
    }
}

class Book {
    var owner : Student?

    deinit {
        print("Book -- deinit")
    }
}

// 2.創(chuàng)建對象
var stu : Student? = Student()
var book : Book? = Book()

// 3.相互引用
stu?.book = book
book?.owner = stu

// 4.對象置nil
stu = nil
book = nil
  • 解決方案
    • swift提供了兩種解決方案
      • weak : 和OC中的__weak一樣是一個弱引用.當(dāng)指向的對象銷毀時,會自動將指針指向nil
      • unowned : 和OC中的__unsafe_unretained.當(dāng)對象銷毀時依然指向原來的位置(容易引起野指針)
// 1.創(chuàng)建類
class Student {
    weak var book : Book?
    // unowned var book : Book = Book()

    deinit {
        print("Student -- deinit")
    }
}

class Book {
    var owner : Student?

    deinit {
        print("Book -- deinit")
    }
}

// 2.創(chuàng)建對象
var stu : Student? = Student()
var book : Book? = Book()

// 3.相互引用
stu?.book = book!
book?.owner = stu

// 4.對象置nil
stu = nil
book = nil
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容