본문 바로가기

iOS

[iOS] Weak, Strong Reference

개요

저번 포스팅에서 소개한 내용처럼 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