Objective-C 메모리 관리


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