오늘 코딩을 하다가, retainCount 값을 찍어보는 테스트 코드를 작성했다.
그런데, 예상하지 못한 결과가 나온다..

코드는 이렇다.

- (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 를 호출 할 필요는 없다

위 두가지의 값진 교훈을 오늘 얻게 되었다.!
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,