Objective-C 메모리 관리
- 메모리란? 프로그램을 실행 시에 사용되는 저장 공간으로 프로그램 실행이나 개발 시에 메모리라하면 RAM을 뜻하며, 컴퓨터의 전원이 종료되면 저장되어 있던 데이터가 없어지는 휘발성을 갖는다.
- 메모리는 외장하드, 디스크처럼 용량이 많지 않기 때문에 사용하지 않는 영역은 해제하여 사용할 수 있는 메모리를 확보하는 것이 필요하다.
- 한정된 메모리를 사용하기 때문에 아래와 같은 기본관리를 따른다.
- 프로그램에서의 메모리 할당은 객체 생성 시에 발생한다.
- 사용 중인 객체는 유지하고, 사용하지 않는 객체는 해제를 하여 메모리를 관리한다.
- 메모리 부족으로 프로그램인 종료 되기도 하므로 항상 메모리 관리를 따르도록 한다.
- Objective-C에서의 메모리 관리
- 리테인 카운트라고하는 객체에 소유된 개수를 확인하여 해당 개수가 '0'이 되면 사용하지 않는다고 판단하여 메모리에서 해제하도록 한다.
- 메모리 관리는 ARC(Automatic Reference Counting) 라는 기술로 리테인 카운트를 관리한다.
- 실제로 해당 코드를 확인하면 리테인 카운트 관리 코드가 들어 있으며, 이는 자동으로 생성된다.
- iOS5, LLVM 3.0 이후부터 반영되었다.
- 객체를 소유하여 메모리를 할당 받고, 메모리가 해제되는 시점 확인하는 예제는 아래와 같다.
- 객체를 생성하여 메모리할당을 받고, 'nil'을 이용하여 해제하게 된다.
- 위에서 메모리가 해제되는 시점이 어딘지를 확인해보면 아래와 같다.
- obj2에서 nil로 먼저 메모리를 해제를 하여 먼저 해제 메시지가 나오고, obj1은 프로그램이 종료되는 것과 동시에 메모리가 해제되는 것을 확인할 수 있다.
- 객체를 할당하여 메모리 할당을 받을 때 메모리의 여러 영역 중에서 힙(Heap) 영역에 할당을 받게 된다.
- 객체는 선언되는 속성에 따라서 지역 변수와 멤버 변수로 나누게 된다.
- 지역 변수(Local Variable)은 메소드 내에서 선언되는 변수로 해당 선언된 코드 단위가 종료되면 메모리 해제가 발생한다.
- 멤버변수(프로퍼티)는 객체 내에서 선언되는 변수로 객체가 해제되면 메모리 해제가 발생한다.
- 지역변수와 멤버변수 관련된 메모리 해제 시점은 아래 그림을 참조하면 된다. (지역변수: 빨간색, 멤버변수: 파란색)
- 메모리 할당 시 제약 사항
- 프로퍼티 이름은 new로 시작하지 못한다.
- 순환 참조에 주의한다.
- 아래와 같이 서로 참조하게 되면 리테인 카운트가 0이 되지 못하여 메모리가 할당된 상태가 유지되므로 주의한다.
- 위 그림은 Car 객체를 Engine 객체에서 소유하고, Engine 객체를 Car 객체에서 소유하므로 서로 소유하는 관계가 되어 메모리 해제가 안될 수도 있다.
- 리테인 카운트 관련 메소드는 사용하지 못한다.
- 아래의 함수를 사용할 수 없다.
- -(id)retain
- -(void)release
- -(id)autorelease
- (NSUInteger)retainCount
- 메모리 해제 용도로 dealloc 메소드는 사용하지 못한다.