Swift에서 사용되는 자동 참조 카운트 메커니즘입니다. 이는 메모리 관리를 자동으로 처리하여 객체가 더 이상 필요하지 않을 때 자동으로 메모리에서 해제되도록 도와줍니다.
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 var friend: Person?
unowned var friend: Person?
미소유 참조 변수는 non-optional 변수이기 때문에 참조하려는 인스턴스가 본인의 생명주기와 같거나 더 길 때에 사용해야 합니다. 반대로 약한 참조는 런타임 중에도 nil로 변경될 수 있기 때문에 옵셔널 변수로 선언되어야 합니다.