반응형
다음과 같이 description 이 정의된 객체에서
-(NSString *) description
{
NSString *description;
description=[[NSString alloc] initWithFormat: @"I am %d years old",4];
return (description);
}
이 함수를 main 또는 owner 객체에서 이용할 경우 description의 memory leak을 방지하려면 다음과 같은 코드를 작성해야 하기 때문에 불편한다.

NSString *desc = [someObject description];
NSLog(@"%@",desc);
[desc release];

코코아에서는 autorelease pool이라는게 존재한다. NSObject는 다음의 메소드를 가진다.

-(id) autorelease;

이 메소드는 미래의 어느 시점에 해당 객체에 대한 release message를 보내도록 되어져 있다. autorelease가 선언된 객체를 보존하기 위해서는 retain 메소드를 사용하면 된다. 코코아에서는 NSAUtoreleasePool 에 관련 객체들이 더해지고 pool 이 파괴될때 등록된 객체들에게 release 메시지가 보내지게 되어 있는 것이다.

따라서 상기의 description 코드는 다음과 같이 수정이 가능하다.
-(NSString *) description
{
NSString *description;
description=[[NSString alloc] initWithFormat: @"I am %d years old",4];
return ([description autorelease]);
}
이를 이용하는 코드는 다음과 같이 간편해진다.

NSLog(@"%@",[someObject description]);

Pool은 NSAutoreleasePool을 init 하면서 active pool이 형성 된다. pool을 release 하게 되면 pool은 deallocation이 되며 이때 등록된 객체들을 release 하게 된다.

Mac OSX 10.4 (Tiger) 이상의 버전에서는 drain 이라는 메소드를 제공하는데 drain은 pool은 그대로 두면서(즉 pool의 retainCount는 1) pool에 있는 객체들을 release 하게 된다.

다음은 AutoRelease를 이용한 예이다.

실행 결과는 다음과 같다.





반응형
Posted by alias
,