전편에서 메모리 누수, Retain Cycle에 대해 공부해봤으니!
이번에는 메모리 누수를 방지할 수 있는 방법을 알아보자.
Weak
를 사용하여 강한 참조가 아닌 약한 참조를 만들어 메모리 누수를 방지할 수 있다!
class TestClass{
weak var testClass: TestClass? = nil // 약한 참조
init(){
print("init")
}
deinit(){
print("deinit")
}
}
var testClass1: TestClass? = TestClass()
var testClass2: TestClass? = TestClass()
testClass1?.testClass = testClass2
testClass2?.testClass = testClass1
testClass1 = nil
testClass2 = nil
약한 참조만 남아있다면 객체들의 메모리는 해제된다.
즉 약한 참조는 참조는 할 수 있지만, Reference Count는 증가하지 않는다.
weak는 객체의 메모리가 해제된 후 그에 대응하는 변수는 자동으로 nil이 된다.
그러므로 모든 weak 참조 변수는 반드시 optional 타입이어야한다.
Unowned는 weak랑 매우 유사하지만 nil이 될 수 없습니다.
따라서 Unowned 변수는 Optional로 선언되어서는 안됩니다.
weak 사용하는 것이 보다 안전하긴 하다.
하지만 변수가 weak가 되기를 원하지않고
해당 변수가 가리키는 객체의 메모리가 해제된 이후에는
해당 영역을 가리키지 않는다는 확신이 있다면 Unowned를 사용하자!
참고 : https://www.thomashanning.com/retain-cycles-weak-unowned-swift/