自動引用計數
工做機制
- 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