인스턴스 할당과 해제

인스턴스 할당과 해제

Objective-C 클래스의 문법 다이어그램을 보면, Objective-C에는 생성자(constructor)와 소멸자(destructor)라는 개념이 없어요. 새 인스턴스는 두 단계 과정으로 만들어져요.

출처: Free Pascal Reference - Allocating and de-allocating Instances

본문

첫 단계로 alloc 메서드를 호출(즉 alloc 메시지를 보내는 것)해요. allocNSObject의 클래스 메서드로, 새 인스턴스를 위한 메모리 포인터를 반환해요. alloc를 쓰는 건 Objective-C의 관례랍니다.

둘째로 initXXX 메시지를 보내요. 관례상 모든 클래스는 인스턴스의 모든 필드를 초기화하는 initXXX 메서드를 하나 이상 갖고 있어요. 이 메서드는 최종 인스턴스 포인터를 반환하는데, 그 값이 Nil일 수도 있어요.

다음 코드가 이 과정을 보여줘요.

var
  obj: NSObject;
begin
  // First allocate the memory.
  obj:=NSObject.alloc;
  // Next, initialise.
  obj:=obj.init;
  // Always check the result !!
  if (Obj=Nil) then
    // Some error;

관례상 일부 필드의 초기화가 실패하면 initXXX 메서드는 Nil을 반환해요. 그래서 이 함수의 반환값을 반드시 검사해야만 해요.

마찬가지로, 특별히 특혜를 받는 소멸자는 없어요. 관례상 dealloc 메서드가 인스턴스의 정리를 담당해요. 이 메서드는 필요한 정리를 수행하도록 재정의(override)할 수 있어요. Destroy와 마찬가지로 직접 호출해서는 안 되고, 대신 release 메서드를 호출해야 해요. Objective-C의 모든 인스턴스는 참조 카운트(reference counted) 방식이며, release는 참조 카운트가 0에 도달할 때만 dealloc을 호출해요.

더 알아보기

  • Objective-C 클래스 선언(objcclass) 문법은 이어지는 섹션에서 이어져요.
  • 참조 카운팅과 release/dealloc의 관계는 Objective-C 런타임 모델에 대한 개념으로 이어져요.