iOS는 다른 프로그래밍 언어보다 Memory 관리가 쉽다고 한다(?)
비교적 최근에 공개되고, High-level의 프로그래밍 언어인 Swift는 사용자의 행동에 따라 Memory를 Allocate 또는 Deallocate한다. Swift에서 Memory를 관리하는 방식을 ARC(Automatic Reference Counting)이라고 한다.
1. ARC는 각각의 Information을 저장하기 위해 Memory 블락으로 저장하고, Init()에 의해 생성되는 Class Instance를 매순간 저장한다.
2. Instance의 타입과 값에 대한 Infromation Memory에 저장된다.
3. 더이상 Class Instance가 필요하지 않을 때, deinit()에 의해 Memory에서 해제된다.
4. ARC는 Constant와 Variable과 같은 Class Instance Property를 유지하며, deinit()이 적용되었을 때, Memory에서 해제된다.
Memory의 관리는 Application에서 매우 중요하다. 다음은 Object-C에서 사용되었던 MRR(Manual Retain Release)에 대한 간략한 소개, ARC에 대해 자세한 설명을 하려고 한다.
과거의 Cocoa 개발자(처음 듣는(??))들은 Memroy 관리를 MRR을 통해서 직접관리 했다고 한다(아래의 예시)
Vehicle *cloudCar = [[Vehicle Alloc]int];
//..
NSString *model = cloudCar.model;
//..
[cloudCar release]
alloc 메소드는 Ojbect를 생성할 때 사용하고, release는 Memory의 해제를 위한 Deallocated 때 사용되었다고 한다(개발자의 판단에 의해 Manual로 진행하기 때문에, 기능은 강력하지만... 사용하기에 까다로울 것 같다..(?)
2011년 Apple은 MRR에서 ARC로 옮겨갔다고 한다. 이에 따라, Swift에서 대부분의 경우 개발자는 아무것도 안 해도 된다.. 특수한 경우가 아니라면?.. ARC는 말 그대로 자동으로 Memory에 대한, 특히 Class Instance가 필요 없는 순간 자동으로 Memory에서 해제되기 때문이다.
아래의 예시는 Class의 Instance를 생성하는 방법이다.
var cloudCar = Vehicle()
그리고 더이상 해당 Instance가 필요하지 않을 때, 아래와 같이 nil
로 초기화하면 해당 Instance는 Memory에서 해제된다.
var cloudCar : Vehicle?
cloudCar = Vehicle()
cloudCar = nil
이때, cloudVar의 property에 접근하는 순간 App은 crash된다.
위와 같은 상황을 피하기 위해, ARC는 Class의 Object의 reference를 추적하기 위해 reference counter
를 사용한다. 모든 Class의 Object에 대해, ARC는 해당 reference를 참조하는 Class Object의 숫자를 증가시킨다. 아래의 예시를 보면 쉽게 이해할 수 있따.