인스턴스 할당과 해제
인스턴스 할당과 해제
Objective-C 클래스의 문법 다이어그램을 보면, Objective-C에는 생성자(constructor)와 소멸자(destructor)라는 개념이 없어요. 새 인스턴스는 두 단계 과정으로 만들어져요.
출처: Free Pascal Reference - Allocating and de-allocating Instances
본문
첫 단계로 alloc 메서드를 호출(즉 alloc 메시지를 보내는 것)해요. alloc는 NSObject의 클래스 메서드로, 새 인스턴스를 위한 메모리 포인터를 반환해요. 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 런타임 모델에 대한 개념으로 이어져요.