Memory Management without ARC
- GC(Garbage Collection)
- 정기적으로 CG가 동작하여 더이상 사용되지 않는 메모리를 반환하는 방식
- OS X 에서만 지원했었으나 버전 10.8부터 deprecated
- MRR(Manual Retain-Relese) / MRC(Manual Referece Counting)
-
RC(Reference Counting) 를 통해 메모리를 수동으로 관리하는 방식
-
retain / release / autorelease 등의 메모리 관리 코드를 직접 호출
-
개발자가 명시적으로 RC 를 증가시키고 감소시키는 작업 수행
Leak vs Dangling Pointer
-
카운트 할당과 해제는 균형이 맞아야 함
- alloc , retain 이 많을 경우는 Memory Leak 발생
- release 가 많을 경우 Dangling Pointer (허상, 고아) 발생

ARC(Automatic Reference Counting)
- ARC 는 클래스의 인스턴스에만 적용 (Class - Reference 타입 , Struct / Enum - Value 타입)
- 활성화된 참조카운트가 하나라도 있을 경우 메모리에서 해제 되지 않음
- 참조 타입
- 강한 참조 (Strong) : 기본값. 참조될 때마다 참조 카운트 1 증가
- 약한 참조 (Weak), 미소유 참조 (Unowned) : 참조 카운트를 증가시키지 않음
- 강한 순환 참조 (Strong Reference Cycles) 에 대한 주의 필요

"ARC는 참조타입에서만 사용됨"*
Strong Reference Cycle
- 객체에 접근 가능한 모든 연결을 끊었음에도 순환 참조로 인해
활성화된 참조 카운트가 남아 있어 메모리 누수가 발생하는 현상
- 앱의 실행이 느려지거나 오동작 또는 오류를 발생시키는 원인이 됨
-> Strong Reference는 기본이고 특별한 상황을 대비하여 Weak Reference로 선언

@객체1이 객체2를 참조하게 되면