Swift(18) ARC(Automatic Reference Counting)

개발렬·2023년 7월 24일
0

Swift

목록 보기
18/23
post-thumbnail

ARC(Automatic Reference Counting)

Swift에서 사용되는 자동 참조 카운트 메커니즘입니다. 이는 메모리 관리를 자동으로 처리하여 객체가 더 이상 필요하지 않을 때 자동으로 메모리에서 해제되도록 도와줍니다.

ARC의 주요 개념과 동작 방식은 다음과 같습니다:

  • 강한 참조(Strong Reference):
    객체가 강한 참조를 가지는 동안에는 참조 카운트가 증가합니다.
    객체가 하나 이상의 강한 참조를 가지면 메모리에서 해제되지 않고 유지됩니다.
  • 참조 카운트(Reference Count):
    객체는 자신을 참조하는 모든 변수 또는 상수가 있을 때, 참조 카운트를 가집니다.
    객체를 참조할 때마다 해당 객체의 참조 카운트가 증가하고, 참조가 해제될 때마다 감소합니다.
  • 순환 참조(Circular Reference):
    두 개 이상의 객체가 서로를 강한 참조로 참조하는 상태를 순환 참조라고 합니다.
    순환 참조가 발생하면 메모리 누수가 발생할 수 있습니다.
    이를 방지하기 위해 약한 참조(Weak Reference)를 사용하여 순환 참조를 피할 수 있습니다.
  • 객체가 더 이상 필요하지 않을 때 메모리 해제:
    객체의 참조 카운트가 0이 되면 해당 객체는 더 이상 필요하지 않으며, 자동으로 메모리에서 해제됩니다.
    더 이상 객체를 참조하는 변수나 상수가 없을 때, 객체의 참조 카운트는 0이 되며 메모리에서 자동으로 해제됩니다.

ARC의 장점

개발자가 수동으로 메모리 관리를 처리할 필요 없이 자동으로 메모리를 관리할 수 있도록 도와줍니다. 따라서 ARC를 통해 메모리 누수를 방지하고 프로그래밍을 더욱 안전하고 효율적으로 만들 수 있습니다.

강한 참조

약한 참조는 메모리 누수를 방지하기 위해 사용되는 참조 방식입니다.
객체를 강하게 참조하지 않고 약하게 참조하는 것을 의미합니다.
약한 참조를 사용하면 참조 대상이 메모리에서 해제되면 자동으로 nil로 설정됩니다.

약한 참조

강한 참조는 기본적인 참조 방식으로, 객체를 강하게 참조하는 것을 의미합니다.
참조하는 동안 객체는 해제되지 않고 메모리에 유지됩니다.
객체가 더 이상 필요하지 않을 때 명시적으로 참조를 해제해야 합니다. (옵셔널을 이용한 nil로 설정 또는 변수/상수를 nil로 설정)

강한 참조를 만들어 보자

class Person {
	var name: String
    var friend: Person? 

    init(name: String) {
    	self.name = name
       	print(name, "init")
    }

   deinit {
   		print("\(name) 객체가 해제되었습니다.")
   }
}

person1?.friend = person2
person2?.friend = person1

person1 = nil
person2 = nil

deinit 메소드가 호출되지 않는 이유는 순환 참조로 인해 두 객체 모두의 참조 카운트가 0이 되지 않아 deinit 메서드가 호출되지 않습니다. person1과 person2를 nil로 설정하더라도, 서로를 참조하는 상태이기 때문에 둘 다 메모리에서 해제되지 않습니다.
즉 객체는 nil을 넣지 못한 상태에서 객체 변수의 메모리가 해제되었기 때문입니다.

weak 약한 참조, 미소유 참조

weak var friend: Person? 
unowned var friend: Person?

미소유 참조 변수는 non-optional 변수이기 때문에 참조하려는 인스턴스가 본인의 생명주기와 같거나 더 길 때에 사용해야 합니다. 반대로 약한 참조는 런타임 중에도 nil로 변경될 수 있기 때문에 옵셔널 변수로 선언되어야 합니다.

profile
Flutter, iOS...나는 모바일 앱 개발자

0개의 댓글