2011. 2. 17. 23:02

objective-c++ 의 클래스 맴버로 stl vector 갖기.



 objective-c에서도 NSMutableArray 혹은 NSMutableDictionary 와 같은 vector, map 과 같은 컨테이너들이 있지만, 사실상 tamplate 을 사용하는 vector나 map 보다는 불편한게 사실입니다.

 일단 NS 컨테이너 시리즈는 NSObject 를 상속받는 객체가 아니라면 사용이 불가하기 때문에, NSObject 상속 클래스의 포인터객체가 아닌경우.. 일반 상수라도 NSNumber 혹은 NSString 등을 이용하여 일부러 데이터를 가공해야 하는데 이 작업 자체가 번거롭지 않을 수 없죠.

 특히 멀티플렛폼 개발에 있어 c++ 및 stl 은 매우 용이한데 일일히 전부 포팅하는 작업도 생각처럼 쉽지만도 않습니다.
 xcode build 옵션에서 'gcc language' 탭에 보면 'compile sources as' 는 실제 언어를 어떤것을 사용할 것인가를 결정해주는 란인데, default 로 'according to file type' 설정이 되어있습니다. 이는 소스파일의 확장자에 따라 유동적으로 처리해주는것이므로 사실상 확장자 .mm 이라면 objective-c 와 objective-c++ 을 같이 사용이 가능합니다.

 잡설이 길었군요 :)

 그냥 objc 클래스의 맴버 객체로 선언해서 사용하면 되지 않느냐 의문을 가질 수 있기 때문에 간단한 설명을 덧붙이자면, objc 클래스의 맴버인 stl vector는 메모리를 직접 관리해줘야 하는 것 같습니다. 정확한 이유는 잘 모르겠으나, 영어가 좀 된다면 직접 애플에 문의해보고 싶지만 그렇지 못한 관계로... 간단한 디버깅을 해보니... vector의 객체복사가 일어나고나면 기존의 맴버 vector객체는 지역변수로 인정하는지... 일회성 객체가 되어버리는듯 합니다.
 실제 클래스의 소멸자(dealloc)가 호출이 되지 않았는데도 불구하고, 맴버 vector는 해제가 이루어지더군요.
 때문인지 계속 어플리케이션이 뻗어버리는 현상이 생깁니다... 잘못된 메모리 참조죠.. 이미 없는 녀석일테니까요..

 실제 프로젝트를 진행하던 도중에 c++ 서버와 objc 클라이언트를 이용한 프로토콜 정의부라 쉽사리 바꾸기엔 애매한 상황이었는데 그냥 쉽게 생각해보니 메모리를 직접 할당/해제 한다면 문제 발생은 없으리라 생각하고.. vector의 객체를 포인터객체로 가져보았으니... 아무 이상 없이 잘 되더군요...





그냥 참고용으로 포스팅 합니다~