개발/Objective-C

retain 관련 알아둘것

강아지아빠 2010. 9. 6. 08:46

먼저 간단한 예제 하나 보고 시작하시죠~

 

<h파일>

NSString* szTestObject;
@property(nonatomic,retain) NSString* szTestObject;

 

<m파일>

@synthesize szTestObject;

 

- (void)viewDidLoad
{
          [super viewDidLoad];

          NSLog(@"RETAIN COUNT (Before): %i", [szTestObject retainCount]);

          self.szTestObject = [[NSString alloc] initWithFormat:@"TEST %i", 10];
          NSLog(@"RETAIN COUNT (After): %i", [szTestObject retainCount]);
}

- (void)dealloc
{
          [szTestObject release];
          [super dealloc];
}

자, 실행결과는 어떨까요?

RETAIN COUNT (Before): 0

RETAIN COUNT (After): 2

그러면, 위의 실행결과 szTestObject는 완전히 삭제가 될까요?

당연히 retain count는 2인데, release가 한번뿐이기 때문에 메모리릭이 발생합니다.

 

여기에서 몇가지 궁금해하시는 분들을 위해 짚고가죠.

 

Q. 왜 결과값 retain count 가 2인가?

A. [self.] 때문입니다. [self.]를 붙이지 않으면 결과값은 1이 됩니다.

    [self.]을 하겠다는 의미는 <h파일>에 선언했던 변수의 property 속성에 따라 값을 지정한다는 의미를 가집니다.

    우리가 <h파일>에서 szTestObject의 property를 nonatomic과 retain 이라는 속성으로 지정했기때문에,

    [[NSString alloc] initWithFormat....] 에서 retain Count + 1을 하고,

    = 을 통해서 값을 assig 하는 과정에서 retain Count + 1 이 되었기 때문에, 총 2가 되어버린것입니다.

 

Q. 그러면 retain count 를 1만 만들기 위해서는 어떻게 해야하는가?

A. 코드를 다음과 같이 고쳐야 합니다.

 

          NSLog(@"RETAIN COUNT (Before): %i", [szTestObject retainCount]);

          NSString* szTempObject = [[NSString alloc] initWithFormat:@"TEST %i", 10];
          self.szTestObject = szTempObject;

          [szTempObject release];
          NSLog(@"RETAIN COUNT (After): %i", [szTestObject retainCount]);

혹은

 

NSLog(@"RETAIN COUNT (Before): %i", [szTestObject retainCount]);

szTestObject = [[NSString alloc] initWithFormat:@"TEST %i", 10];
NSLog(@"RETAIN COUNT (After): %i", [szTestObject retainCount]);

 

혹은

 

@property(nonatomic,assign) NSString* szTestObject;

RETAIN COUNT (Before): 0

RETAIN COUNT (After): 1

 

초보적이라고 보기엔 너무나 많은 코드에서 위와 같은 실수로 메모리릭을 만들고 있고, 저 또한 나도 모르게 retain count 가 올라가 있어,

self나 retain 프로퍼티의 무분별한 사용으로 메모리 관리에 많은 어려움을 겪었던 경험이 있기때문에...

이런 부분에 대해서 한번쯤 짚고 넘어가는게 어떨까 하는 차원에서 [팁] 이라는 주제로 공유해봅니다.

저같은 실수를 다른분들은 하지 않으셨으면 좋겠네요~ ^___________________^