[Objective C] memory, retain, reference count, 메모리, 메모리관리
Programming/Objective C 2010. 12. 14. 17:56object-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];
}
'Programming > Objective C' 카테고리의 다른 글
[Objective C] Protocol 과 cypyWidthZone메소드 (0) | 2011.01.07 |
---|---|
[Objective C] UIView, CGPoint, CGSize, CGRect (0) | 2010.12.30 |
[Objective C] NSArray, NSMutableArray 객체 (0) | 2010.12.29 |