swift

ARC(Auto Reference Count)

motosw3600 2021. 12. 7. 16:01

ARC

swift는 Automatic Reference Counting(ARC)를 사용하여 메모리를 추적하고 관리합니다. Swift의 대부분의 경우에서 메모리 관리가 그저 작동 한다는 의미로 직접 메모리를 관리할 필요가 없습니다. ARC는 클래스의 인스턴스가 더이상 필요하지 않을때 클래스 인스턴스에서 사용하는 메모리를 자동으로 해제 합니다.

 

  • ARC는 클래스 인스턴스가 더 이상 필요하지 않을 때 메모리를 자동 해제 (컴파일시 작동)
  • 힙에 메모리를 자동적으로 할당할 때 ARC가 메모리를 자동으로 해제시켜 준다.
  • 순환참조가 발생할 시 영구적으로 메모리가 해제되지 않을 수 있음​
  • Swift이전의 Object-C에선 ARC가 아니라 MRC(Manual Reference Counting)힙에 메모리를 직접 할당/해제

ARC 관리 방법

Reference Counting을 이용

메모리의 참조횟수(RC)를 계산해서 참조 횟수가 0이 되면 더 이상 사용하지 않는 메모리라 생각하여 메모리 해제

모든 인스턴스는 자신의 RC값을 가지고 있다.

RC Count Plus(+)

1. 인스턴스를 새로 생성 할 때

class A {
   var num: Int = 0 
}

var test1 = A() // Instance RC : 1

 

2. 기존 인스턴스를 다른 변수가 참조할 때

class A {
   var num: Int = 0 
}

var test1 = A() // Instance RC : 1
var test2 = test1 // Instance RC : 2
 

RC Count down(-)

1. 인스턴스를 가르키던 변수가 메모리에서 해제 되었을 때

func copy(val: A) { 
   let copyVal = val // 2. Instance RC : 2 
} 

let test = A() // 1. Instance RC : 1 
copy(val: test) // 3. Instance RC : 1 (함수를 빠져나오면서 메모리 해제)

 

2. nil 지정시

class A {
   var num: Int = 0 
}

var test1 = A() // Instance RC : 1 
var test2 = test1 // Instance RC : 2 
test2 = nil // Instance RC : 1
test1 = nil // Instance RC : 0

 

3. 변수에 다른 값 지정시

class A {
   var num: Int = 0 
}

var test1 = A() // test1 Instance RC : 1 
var test2 = A() // test2 Instance RC : 1 
test1 = test2 // test2 Instance RC : 2, test1 Instance RC : 0

 

4. 속해 있는 클래스 인스턴스가 메모리에서 해제될 때

class A {
   var num: Int = 0 
   var subA : SubClass? = .init(name: "Instance") 
} 

class SubClass {
   var subname: String? 

   init(name: String?) {
      self.subname = name 
   } 
}

var test1: A? = A() // A Instance RC : 1, subClass Instance RC : 1 
test1 = nil // A Instance RC : 0, subClass Instance RC : 0 (두 instance RC 모두 -1)

 

'swift' 카테고리의 다른 글

Layout Update Method  (0) 2021.12.09
KVC, KVO  (0) 2021.12.08
Properties  (0) 2021.12.08
Strong, Weak, Unowned, 순환참조  (0) 2021.12.07
Swift언어의 특징  (0) 2021.12.07