반응형
* new, alloc, copy 등을 이용하여 오브젝트를 생성할때 생성된 오브젝트의 retain count는 1이며, 오브젝트가 다 사용되었으면 release 나 autorelease를 보내어 clean up 을 해야 한다.
* 다른 메카니즘을 통해서 객체를 소유하고 있는 경우 (retain이 1 이고 autorelease 된 경우) clean up에 대해서 신경쓸 필요는 없다. 만약 특정 기간동안에 해당 객체를 사용하고 싶으면 retain 하고 사용후 release 하면 된다.
* 객체를 retain을 했으면 release 하거나 autorelease 해야 한다.

다음의 두 코드를 비교해 보자

1. 명시적 release가 필요한 경우
NSMutableArray *array;
array=[[NSMutableArray alloc] init]; //count: 1
[array release]; //count: 0

2. 명시적 release가 필요 없는 경우
NSMutablArray *array;
array=[NSMutableArray arrayWithCapacity: 17];
//count: 1, autorelease

1의 경우 new, alloc, copy등을 이용하여 오브젝트를 생성한 경우로 명시적인 release가 필요하지만 2에서는 다른 방법으로 객체를 얻었기 때문에 명시적인 release가 불필요하다. 

객체를 소유하도록 하는 경우 new/alloc/copy 등을 통해서 생성하면 dealloc에서 release 해주어야 한다

-(void) init_params
{
flonkArray=[NSMutableArray new]; //count : 1
}
-(void) dealloc
{
[flonkArray release]; //count : 0
[super dealloc];
}

그외의 방법으로 객제를 얻었으면 retain을 해주어야 하고 dealloc에서 release 해주어야 한다.

-(void) init_params
{
flonkArray=[NSMutableArray arrayWithCapacity: 17]; 
[flonkArray retain]//count : 2, 1 autorelease
}
-(void) dealloc
{
[flonkArray release]; //count : 0
[super dealloc];
}

GUI등의 event loop에서 autorelease pool은 event 가 생길때 생성되고 끝나면 파괴 된다. event loop에서 오브젝트를 가지고 있어야 할 경우 상기와 같이 retain -> release 하는 코드가 필요하다.

Objective-C 2.0 부터는 garbage collection 을 지원한다. 따라서 자바에서와 같이 객체를 생성하고 사용해도 된다는 것이다. XCode에서는 기본적으로 Garbage Collection 옵션이 꺼져 있다. Project Tab에서 Edit Project Settings에서 garage를 찾아서 설정해주면 된다. (다음 화면)


%% 주의해야 할 것은 iPhone Software를 개발할 경우 garbage collection을 지원하지 않으며 애플에서는 autorelease를 사용하지 않을 것을 권장하고 있다. (아마 iphone의 경우 메모리 관리가 매우 중요하기 때문일 것이다.)
반응형
Posted by alias
,