posted by By훈트 2010.12.14 17:56


object-c에서의 메모리 관리는 레퍼런스 카운트 (reference count)를 이용합니다.

모든 객체는 자신을 참조하는 수에 대한 내부 카운터를 가지고 있습니다.


-alloc : 해당 객체에 메모리를 할당하고 레퍼런스 카운트를 1 올립니다.

-retain : 해당 객체의 레퍼런스 카운트를 1 올립니다.

-copy : 해당 객체의 복사본을 만듭니다. 그리고 복사본의 레퍼런스 카운트를 1 올립니다.

-release : 해당 객체의 레퍼런스 카운트를 1 낮춥니다.

-autorelease : 정해지지 않은 시점에 해당 객체의 레퍼런스 카운트가 -1 낮아집니다.


규칙

1. 블록 내에서 alloc, retain, copy의 수와 release, autorelease 수가 동일해야 합니다.

2. factory 함수를 사용해 생성한 객체의 경우는 대부분 autorelease로 반환됩니다. 따로 release를 할 필요가 없습니다.

3. 클래스의 인스턴스 변수들은 dealloc 메소드에서 다 release해야 합니다.


예1. dealloc


- (void) dealloc

{

[vid release];

[title release];

}


예2. 로컬블록


{

NSString *name = [[NSString alloc] initWithString:@"Dreaming"];

NSString *co = [NSString stringWithString:"daum"];

NSString *book = @"iPhone Book";


//alloc만 release하면 됩니다.

[name release];

}


예3. autorelease 블록지정 : 해당블록의 autorelease메시지를 받은 객체들은 autorelease가 release되자마자 메모리에서 사라집니다.


NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

~~~

~~~

~~~

[pool release];


예4. 다양한 예


-(void) resetTitle

{

//alloc으로 인해 1 올라감

NSString *newTitle = [[NSString alloc] initWithString:@"A"];

[self setTitle:newTitle];    //접근자 사용

[newTitle release];         //메모리에서 제거

}


-(void) resetTitle

{

//factory함수로 autorelease가 됨, release할 필요 없음.

NSString *newTitle = [NSString stringWithString:@"A"];

[self setTitle:newTitle];      //접근자사용

}


NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];

int i;


for ( i = 0; i < 10; i++)

{

NSNumber *n = [NSNumber numberWithInt:i];

[array addObject:n];

}


NSNumber인 n을 생성했고 autorelease 메시지를 받아 언젠가 레퍼런스 카운트가 0으로 되어 사라질 것 같습니다만, 배열에 추가하는 addObject는 받는 인자를 바로 retain합니다. 그러니 한시적으로 레퍼런스 카운트가 2가 됩니다만 pool이 비워질 때 1이 되고, 배열이 사라질때 0이 됩니다.


NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];

int i;


for ( i = 0; i < 10; i++)

{

NSNumber *n = [[NSNumber alloc] initWithInt:i];

[array addObject:n];

[n release];

}


[출처]새카만곰돌이님의 블로그

저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

티스토리 툴바