Reference count
- 인스턴스가 생성되면, 메모리를 할당받게 되고 해당 인스턴스에 대한 reference count가 증가하게 된다.
class MyClass() {...} var myClass : MyClass? = MyClass() // Reference Count = 1- 인스턴스를 참조하는 경우 reference count가 증가한다.
var myClass2 = myClass // Reference Count = 2- 변수에 nil을 할당해줘서 인스턴스를 해제해주면 reference count가 감소한다.
myClass = nil // Reference Count = 2-1 = 1인스턴스가 최종적으로 메모리에서 해제되면 reference count가 0이 된다
ARC (Automatic reference count)
- ARC 는 Swift 의 메모리 관리 시스템. Java 에 GC 가 있다면 Swift 에는 ARC 가 있음.
- Reference Count 를 자동으로 계산. (Automatic)
- 객체가 생성될 때 RC 가 1 로 설정
- 객체가 다른 변수나 속성에 할당되어 참조될때마다 RC 가 1 씩 증가
- 객체에 대한 참조가 해제될때마다 RC 가 감소
- RC 0 이 되면 더 이상 사용되지 않는 것으로 간주되어 메모리에서 해제.
MRC (Manual Reference Counting)
- MRC 는 Objective-C 에서 사용하는 메모리 관리 시스템.
- Reference Count 를 개발자가 코드로 직접 계산. (Manual)
- 객체가 생성될때 개발자가 명시적으로 메모리 할당
- 객체를 다른 변수나 속성에 할당되어 참조될때마다 개발자가 명시적으로 RC 증가
- 객체에 대한 참조가 해제될때마다 개발자가 명시적으로 RC 감소
- RC 가 0 이되면 개발자가 명시적으로 메모리에서 해제.
순환 참조
- A 가 B 를 참조하고 (A→B),B 가 A 를 참조해서 (B→A), 서로가 서로를 참조하는 상황을 순환 참조라고 한다.
- 일반적으로 순환 참조는 메모리 누수를 발생시키는 대표적인 사례다.
class Person { var pet: Dog? init() { print("Person 클래스 생성") } deinit { print("Person 클래스 소멸") } } class Dog { var owner: Person? init() { print("Dog 클래스 생성") } deinit { print("Dog 클래스 소멸") } } // person rc = 1 var person: Person? = Person() // dog rc = 1 var dog: Dog? = Dog() // dog rc = 2 person?.pet = dog // person rc = 2 dog?.owner = person // person rc = 1 person = nil // dog rc = 1 dog = nil
약참조와 강참조
순환 참조와 같은 문제를 해결하기 위한 참조 기능
- 약참조
- Reference Count 를 증가시키지 않으면서 참조하는 것.
- weak 키워드를 붙여서 약참조를 할 수 있다.
- 강참조
- Reference Count 를 증가시키면서 참조하는 것.
- 일반적인 참조 방식을 말한다.
자동으로 메모리 관리를 해주는데 왜 굳이 또 매뉴얼로 관리를 해줘야 하는지 약간 이해가 가지 않았다.
ARC만으로는 해결되지 않는 상황이 있어 항상 신경써서 메모리 관리를 해주어야 한다.
ARC가 자동으로 관리해준다고 안심하지 말고 메모리 관리에도 신경을 기울여야 더 좋은 개발자가 될 수 있을 것 같다.
CRUD에 대해 공부해 볼 예정~!