본문 바로가기

Objective-C

[Objective-C] retainCount

Objective-C 2.0 책으로 공부를 하고 있다.

Xcode는 최신 버전인 것 같고..

책에서는 NSAutoReleasePool을 사용하고 있는데 

Xcode가 기본적으로 Automatic Reference Counting를 쓰도록 되어 있어서

책과 실제 작성 가능한 코드의 GAP에서 또 한참 헤맸다 --;


ARC가 활성화 되어있으면 [pool drain]이나 retaionCount와 같은 메서드를 아예 사용하지 못 한다.


좀 찾아보니 아직 써드파티 라이브러리등은 ARC를 지원하지 않는다고 하고..

뭐 잘쓰면 약 못 쓰면 독이라는 이야기도 많다.

처음 Objective-C를 배우는 입장에서 이 ARC가 굉장히 편하게 다가오기는 하는데

근본적으로 GC와는 다른 메커니즘으로 돌아가는 이 ARC를 내용도 모르고 그냥 믿고 쓰기에는 또

성격상 맞지 않아서.... 책에 있는 메모리 관리에 대한 내용을 잘 읽어보고는 있다..


나중에는 뭐... 다 ARC를 사용하는 코드가 되지 않을까 싶지만...


아무튼...

책의 예제 중 retainCount를 조회하는 예제가 있는데..



NSNumber *myInt = [NSNumber numberWithInteger: 100];
NSLog(@"%lx", (unsigned long) [myInt retainCount]);

이라는 코드가 있다.

책에는 위 예제는 1을 출력한다고 하는데

내가 직접 작성해서 돌려보니 7fffff--- 가 나온다.


unsinged long의 최대값인거 같은데 뭔짓을 해도 안 바뀐다.. ㅠㅠ


좀 더 찾아보니 


스택객체의 retainCount는 0xFFFFFFFF로 UINT_MAX 값을 갖습니다.

애플 개발자 문서에 절대 release되지 말아야 할 객체는 UINT_MAX를 반환해야 한다고 명시되어 있는데요,

initWithString으로 초기화 하면 해당 객체를 스택객체로 만들어 버립니다.

이 객체에는 release메시지를 보내도 아무런 효과가 없습니다. 

참고로 initWithFormat으로 만들면 힙객체가 됩니다.


이라는 문구를 봤다..


아 저게 혹시 스택객체인가.. 싶어서 NSMutableArray를 하나 생성해서 retainCount를 찍어보니 "1"이 나온다..


후덜...


단순 문법이 아니라 또 이렇게 내용이 들어가니.. 엄청 새롭다..

힙객체는 뭐고 스택객체는 뭐여...

그리고 컴파일러가 버전업 되면서 메서드의 작동 방식이 바뀐건지...


훔,,

NSNumber도 [[NSNumber alloc] init] 으로 생성하니 retainCount가 0이 되는군...


http://stackoverflow.com/questions/7252115/nsnumber-numberwith-n-initwith