개요
저번 포스팅에서 소개한 내용처럼 iOS(Swift, Objective-C)는 ARC를 사용한다. 이 과정에서 iOS의 참조 방식은 Weak, Strong, Unowned 세 가지로 나뉜다.
Strong
객체를 참조하고 Reference Count를 증가시킨다. 기존에 A 객체에서 X를 참조하고 있으면 count = 1이고, B가 X를 참조하도록 선언하면 count = 2가 된다. A와 B가 X를 참조하는 reference를 모두 nil로 만들 때 할당이 해제된다.
var a1: A? = A()
var a2: A? = a1
var a3: A? = a2
a1 = nil
a2 = nil
a3 = nil //해제
Strong을 사용할 시 유의해야되는 점은 Strong Reference Cycle이 생길 수 있다는 점이다. 즉, 서로가 서로를 참조하여 Reference Count가 0이 될 수 없어 모두 메모리에 해제되지 않는 메모리 릭이 발생한다.
class A {
var a: A? = nil
}
var a1: A? = A()
var a2: A? = A()
// Strong Reference Cycle
a1.a = a2
a2.a = a1
// Memory Leak
a1 = nil
a2 = nil
weak
위와 같은 문제를 해결하기 위해 약한 참조(weak reference)를 사용한다. 객체를 참조하고, Reference Count는 증가시키지 않는다.
class A {
weak var a: A? = nil
}
var a1: A? = A()
var a2: A? = A()
// Strong Reference Cycle
a1.a = a2
a2.a = a1
// 할당 해제
a1 = nil
a2 = nil
Default는 강한 참조(strong reference)이고, 약한 참조(weak reference)를 사용하기 위해선 weak 키워드를 붙여야 한다.
'iOS' 카테고리의 다른 글
[iOS] Dispatch Queue (0) | 2023.01.07 |
---|---|
[iOS] Auto Referencing Counting (0) | 2022.04.24 |