retain 관련 알아둘것
먼저 간단한 예제 하나 보고 시작하시죠~
<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 프로퍼티의 무분별한 사용으로 메모리 관리에 많은 어려움을 겪었던 경험이 있기때문에...
이런 부분에 대해서 한번쯤 짚고 넘어가는게 어떨까 하는 차원에서 [팁] 이라는 주제로 공유해봅니다.
저같은 실수를 다른분들은 하지 않으셨으면 좋겠네요~ ^___________________^