인스턴스 파기

C 언어에서는, 실행시에 동적으로 확보한 메모리 영역은, 반드시 해제하지 않으면 안됩니다. 표준 함수의 malloc() 이 확보한 메모리 영역은 free() 함수로 해방하지 않으면, 메모리 영역이 불필요하게 되어, 메모리 참조가 없어진 후에도, 어플리케이션을 위해서 계속 대기하기 위해 , 결과적으로 메모리 리크가 됩니다.

Objective-C도 같이 Java나 Microsoft .NET와 같이, 메모리를 자동적으로 해제하는 기능은 존재하지 않습니다. 거기서, Object를 루트 클래스로 하는 alloc가 확보한 인스턴스는, 불필요하게 된 시점에서 free 메세지를 송신해 해제하지 않으면 안됩니다.

free 메세지는, 그 인스턴스가 확보하고 있는 메모리 영역을 해제해, 인스턴스를 완전하게 파기하기 위해서 송신됩니다. 초기화에 대해서, 인스턴스가 파기되는 타이밍에 어떠한 처리가 필요한 경우는 free 메세지를 오버라이드(override) 하면 좋을 것입니다. 다만, 오버라이드(override)때는 슈퍼 클래스에 free를 송신하는 것을 잊지말아야됩니다.

#import <stdio.h>

#import <objc/Object.h>

@interface Test : Object
-(id)init;
-(id)free;
@end

@implementation Test
- (id)init {
	id obj = [super init];
	printf("init method\n");
	return obj;
}
- (id)free {
	printf("free method\n");
	return [super free];
}
@end

int main() {
	id obj = [Test new];
	[obj free];

	return 0;
}

이 프로그램의 main() 함수 부분에서는, 인스턴스를 new 메세지로 생성 및 초기화해, 직후에 free 메세지로 파기하고 있습니다. init 와 free 메소드를 오버라이드(override) 해서, 메소드가 실행된 것을 증명하기 위해서 문자열을 출력하고 있습니다.

통상, 초기화는 루트 클래스로부터 행해져 해제은 리프로부터 행해집니다. init 메소드에서는, 메소드의 선두에서 부모클래스의 init 메소드를 호출하고, free 메소드에서는 메소드의 말미에서 부모클래스의 free 를 호출합니다.


Posted by tklee

댓글을 달아 주세요