오늘 코딩을 하다가, retainCount 값을 찍어보는 테스트 코드를 작성했다.
그런데, 예상하지 못한 결과가 나온다..
코드는 이렇다.
- (IBAction) onTouchUpTest:(id) sender
{
// NSString Object
그런데, 예상하지 못한 결과가 나온다..
코드는 이렇다.
- (IBAction) onTouchUpTest:(id) sender
{
// NSString Object
NSString* pString = [[NSString alloc] initWithString:@"Some String"];
NSLog(@"String ==> %@", pString);
NSLog(@"Retain : %08X", [pString retainCount]);
[pString release];
NSLog(@"Released .. Retain 2 : %d", [pString retainCount]);
pString = nil;
NSLog(@"Released .. Retain 3 : %d", [pString retainCount]);
NSLog(@"Release again");
[pString release];
NSLog(@"Second Release OK");
//=== 일반 Object
LHttpCommManager* pManager = [[LHttpCommManager alloc] initWithServerInfo:@"ABC"];
NSLog(@"Retain for Manager : %d", [pManager retainCount]);
[pManager release];
NSLog(@"Retain after release : %d", [pManager retainCount]);
pManager = nil;
NSLog(@"Retain after allocating nil : %d", [pManager retainCount]);
}
출력 결과는 참으로 웃긴다.
2010-10-12 23:14:54.331 TestBed[9108:207] String ==> Some String
2010-10-12 23:14:54.332 TestBed[9108:207] Retain : 7FFFFFFF
2010-10-12 23:14:54.333 TestBed[9108:207] Released .. Retain 2 : 2147483647
2010-10-12 23:14:54.334 TestBed[9108:207] Released .. Retain 3 : 0
2010-10-12 23:14:54.335 TestBed[9108:207] Release again
2010-10-12 23:14:54.335 TestBed[9108:207] Second Release OK
2010-10-12 23:14:54.336 TestBed[9108:207] Retain for Manager : 1
2010-10-12 23:14:54.337 TestBed[9108:207] Retain after release : 1
2010-10-12 23:14:54.337 TestBed[9108:207] Retain after allocating nil : 0
결과를 보면, 몇가지 주의해야 할 점들이 보인다.
1. NSString 의 경우, retainCount 가 7FFFFFFF 값으로, 양의 정수 최대치가 들어온다.
2. NSString 을 Release 하더라도, retainCount 가 줄어들지 않는다.
3. nil 을 할당 한 후에도, release 나 retainCount 함수가 nil 인 Object 에 대하여 실행 된다
4. 일반 Object 는 retainCount 가 최초 1이 제대로 들어온다.
5. release 를 한다고 해도, 바로 retainCount 가 줄어들지 않는다.
==> 결론은, retainCount 를 너무 의식하거나, 이를 기반으로 코딩하지 말아야 한다.
==> release 할 Object 가 nil 인지 검사하고 release 를 호출 할 필요는 없다
위 두가지의 값진 교훈을 오늘 얻게 되었다.!
NSLog(@"String ==> %@", pString);
NSLog(@"Retain : %08X", [pString retainCount]);
[pString release];
NSLog(@"Released .. Retain 2 : %d", [pString retainCount]);
pString = nil;
NSLog(@"Released .. Retain 3 : %d", [pString retainCount]);
NSLog(@"Release again");
[pString release];
NSLog(@"Second Release OK");
//=== 일반 Object
LHttpCommManager* pManager = [[LHttpCommManager alloc] initWithServerInfo:@"ABC"];
NSLog(@"Retain for Manager : %d", [pManager retainCount]);
[pManager release];
NSLog(@"Retain after release : %d", [pManager retainCount]);
pManager = nil;
NSLog(@"Retain after allocating nil : %d", [pManager retainCount]);
}
출력 결과는 참으로 웃긴다.
2010-10-12 23:14:54.331 TestBed[9108:207] String ==> Some String
2010-10-12 23:14:54.332 TestBed[9108:207] Retain : 7FFFFFFF
2010-10-12 23:14:54.333 TestBed[9108:207] Released .. Retain 2 : 2147483647
2010-10-12 23:14:54.334 TestBed[9108:207] Released .. Retain 3 : 0
2010-10-12 23:14:54.335 TestBed[9108:207] Release again
2010-10-12 23:14:54.335 TestBed[9108:207] Second Release OK
2010-10-12 23:14:54.336 TestBed[9108:207] Retain for Manager : 1
2010-10-12 23:14:54.337 TestBed[9108:207] Retain after release : 1
2010-10-12 23:14:54.337 TestBed[9108:207] Retain after allocating nil : 0
결과를 보면, 몇가지 주의해야 할 점들이 보인다.
1. NSString 의 경우, retainCount 가 7FFFFFFF 값으로, 양의 정수 최대치가 들어온다.
2. NSString 을 Release 하더라도, retainCount 가 줄어들지 않는다.
3. nil 을 할당 한 후에도, release 나 retainCount 함수가 nil 인 Object 에 대하여 실행 된다
4. 일반 Object 는 retainCount 가 최초 1이 제대로 들어온다.
5. release 를 한다고 해도, 바로 retainCount 가 줄어들지 않는다.
==> 결론은, retainCount 를 너무 의식하거나, 이를 기반으로 코딩하지 말아야 한다.
==> release 할 Object 가 nil 인지 검사하고 release 를 호출 할 필요는 없다
위 두가지의 값진 교훈을 오늘 얻게 되었다.!
반응형
'Software Development > Mobile' 카테고리의 다른 글
안드로이드 개발 #3 - 앱 실행하기 (0) | 2016.02.08 |
---|---|
안드로이드 개발 #2 - 새 프로젝트 살펴보기 (0) | 2016.02.06 |
안드로이드 개발 #1 - Android Studio 설치 및 새프로젝트 생성 (0) | 2016.02.06 |
P3P 와 쿠키 사용 관계 (0) | 2010.02.25 |
Table 밖에서 TR, TD 쓰면 (0) | 2009.08.15 |