'Objective c'에 해당되는 글 2건

  1. 2008.07.22 NSString의 객체 참조
  2. 2008.07.22 Memory Management
NSString 객체를 만들 때, 참 햇갈리는게 있더군요 -_-;;

한동안 MFC와 C언어만 하다보니, java같은 개념은 다 까먹은 듯 합니다 ㅠㅠ

어쩄든 오늘 삽질 한 결과는 다음과 같습니다.

1. @"abcde" 이렇게 상수형 문자열은 객체가 아니기 때문에 retain count가 없습니다. 없는 건 아니고 쓰레기값...
2. XXXWithString 계열의 함수는 parameter로 입력된 NSString객체를 참조합니다. 즉 2개의 포인터가 하나의 객체를 보게 되어 parameter로 입력된 NSString 객체는 retain count가 1 증가하게 됩니다.
3. XXXWithFormat 계열의 함수는 parameter로 입력된 NSString객체의 값을 복사합니다. 즉 parameter로 입력된 NSString객체의 retain count는 변화가 없으며, 새로운 객체가 생성되는 것 입니다.

오늘 몇시간 동안 삽질해서 알게 된 내용이네요 -_-;;;



080815 수정
StringWithFormat함수는 내부적으로 autorelease pool을 사용하는 것 같습니다. autorelease pool을 만들지 않은 상태에서 호출하면 error가 발생하는 군요. 그 말은 임시 NSString 객체를 만들 때 메모라 할당과 해제를 신경쓰지 않아도 된다는 것인데... iPhone 프로그래밍에서는 못써먹는 건가 봅니다 -_-;;
Posted by yunseong

머 제목은 매우 거창합니다만 ㅡㅡ;;

Cocoa framework의 Objective-C는 C와는 다른 메모리 관리 mechanism을 가지고 있습니다.
바로 retain / release를 통한 메모리 관리인데요, 쉽게 말하면 reference count를 통해
메모리를 해제할 지 말지를 결정하는 것입니다.

예전에 학교 다닐때 memory leak관련해서 연구할 때 이거와 관련된 내용을 공부한 적이 있는데,
실제 이 방식으로 동작하는 언어가 있는 줄은 몰랐네요.

어쨌든 오늘 이 내용을 공부도 하고 이것저것 실험도 해봤는데요, 사실 엄청나게 삽질을 했습니다.

다름이 아니라 NSString 객체를 이용하여 테스트 했는데, NSString객체도 잘 모르는 상태에서
이것저것 하다 보니 완전 삽질만 했습니다.

어쨌든 내린 결론은, Release도 함부로 하면 안된다는 것입니다. ㅡㅡ;;

NSObject의 dealloc을 override하여 사용해 봤는데, 멤버 변수를 dealloc에서 release시키면,
main함수의 AutoReleasePool이 drain할 때 오류가 발생하더군요.
모든 멤버변수는 dealloc내의 super dealloc에서 모두 알아서 release하나 봅니다.

물론 자체적으로 release시키고, nil로 값을 셋팅해주면 nil은 super dealloc에서 호출되는 release를 무시할 것이기
때문에, 큰 문제는 없어보이겠지만, nil에 message를 던지는 것은 가급적 피하려고 하고 있습니다. 나중에 bug를 만들어낼 거 같아서요.

어쨌든!!!
아무리 dealloc을 override했어도, 멤버변수가 가리키는 객체는 강제로 release시키지 말자는 게 오늘의 교훈이었습니다. 근데 맞나 모르겠네요 -_-;;;
Posted by yunseong
이전버튼 1 이전버튼