自動引用計數

自動引用計數

工做機制

  • Swift和OC同樣,採用自動引用計數來管理內容
    • 當有一個強引用指向某一個動向時,該對象的引用計數會自動+1
    • 當該強引用消失時,引用計數會自動-1
    • 當引用計數爲0時,該對象會被銷燬

循環引用

  • 在一般狀況下,ARC是會自動幫助咱們管理內存的
  • 可是在開發中咱們常常會出現循環引用的問題,好比下面的示例
    • Student對Book對象有一個強引用
    • 而Book對Student有一個強引用
    • 在兩個對象都指向nil時,依然不會被銷燬,就造成了循環引用
// 1.建立類
class Student {
    var book : Book?

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

class Book {
    var owner : Student?

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

// 2.建立對象
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同樣是一個弱引用.當指向的對象銷燬時,會自動將指針指向nil
      • unowned : 和OC中的__unsafe_unretained.當對象銷燬時依然指向原來的位置(容易引發野指針)
// 1.建立類
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.建立對象
var stu : Student? = Student()
var book : Book? = Book()

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

// 4.對象置nil
stu = nil
book = nil
相關文章
相關標籤/搜索