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