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의 객체를 포인터객체로 가져보았으니... 아무 이상 없이 잘 되더군요...





그냥 참고용으로 포스팅 합니다~
2011. 1. 5. 21:30

log4cxx linux(리눅스) 빌드.


 오랜만에 나타나서 log4cxx 빌드 및 사용 팁을 간단하게 올립니다.

 보통 root권한의 경우엔 /usr/local 에 설치하는게 보통이지만, 저는 공용 서버에서 일반사용자 권한으로 사용하기 때문에 경로는 사용하는 사람의 입맛에 따라 바꿔주시면 됩니다.

 그리고 wget을 이용해서 얻어온것이니 wget이 없거나, 별도로 다운받아 사용하실 분들은 apache 홈페이지에서 직접 다운받아 사용하셔도 됩니다.

1. apr(Apache Portable Runtime) 다운로드 및 빌드.

 ~/$ cd src
 $ wget http://apache.tt.co.kr//apr/apr-1.4.2.tar.gz

 $ tar -xvzf apr-1.4.2.tar.gz

 $ cd apr-1.4.2
 $ ./configure --prefix=~/src/apr-1.4.2

 $ make

 $ make install
 $ ln -s ~/src/apr-1.4.2 ~/lib/apr


2. apr-util 다운로드 및 빌드

 ~/$ cd src
 $ wget http://apache.tt.co.kr//apr/apr-util-1.3.10.tar.gz

 $ tar -xvzf apr-util-1.3.10.tar.gz

 $ cd apr-util-1.3.10
 $ ./configure --prefix=~/lib/apr --with-apr=~/lib/apr

 $ make

 $ make install
 
3. log4cxx 다운로드 및 빌드

 ~/$ cd src
 $ wget http://apache.mirror.cdnetworks.com//logging/log4cxx/0.10.0/apache-log4cxx-0.10.0.tar.gz

 $ tar -xvzf apache-log4cxx-0.10.0.tar.gz

 $ cd apache-log4cxx-0.10.0
 $ ./configure --prefix=~/src/apache-log4cxx-0.10.0 --enable-cppunit --with-apr=~/lib/apr --with-apr-util=~/lib/apr --with-charset=utf-8

 $ make

 ※ log4cxx 0.10.0 릴리즈된 버전을 다운받아 컴파일 하면 리눅스에서 컴파일 에러납니다. log4cxx repository 보면 수정사항이 있으나, 세가지 수정사항 때문에 svn checkout 받기엔 좀 -.-;;
  에러나는 부분은 세곳입니다. 
 (1) src/main/cpp/inputstreamreader.cpp 의 상단에 "#include <string.h>" 추가
 (2) src/main/cpp/socketoutputstream.cpp 의 상단에 "#include <string.h>" 추가
 (3) src/examples/cpp/console.cpp 의 상단에 "#include <stdio.h>" 와 "#include <string.h>" 추가

 $ make install


빌드는 완료되었습니다. 이제 사용법을 알아야겠죠. 뭐 라이브러리 링크하는게 뭐 어렵다고 할지 몰라도... 이게 리눅스 라이브러리 링크에 대한 이해가 없으면 좀 햇갈릴 수도 있으니 그냥 간단히 몇문장 더 달겠습니다.
(전 아직도 헷갈림 -.-;)

일단 사용 편의성을 위해 환경 PATH (export) 등록하면 편하겠지만, 사실상 로깅라이브러리는 서버프로그램을 제외하곤 사용할 곳이 많지 않기때문에 링크정도만 하겠습니다.

4. log4cxx 라이브러리 링크 방법

 $ ln -s ~/src/apache-log4cxx-0.10.0 ~/lib/log4cxx
 $ ln -s ~/lib/log4cxx/lib/liblog4cxx.so ~/lib/liblog4cxx.so
 $ ln -s ~/lib/log4cxx/lib/liblog4cxx.so.10 ~/lib/liblog4cxx.so.10


 위 심볼릭링크만 생성해주고 gcc 컴파일시 include 옵션과 library link 옵션만 아래와 같이 주면 됩니다.
 INC = -I~/lib/log4cxx/include
 LIB = -llog4cxx -L~/lib/log4cxx/lib

(사실 위에 심볼릭 링크를 왜 인식 못하는지 모르겠습니다 -.- 일단 귀찮으니 내비뒀슴니다.)



이제 include 해서 사용하면 됩니다.
상세한 사용법은 나중에 -_-z
2010. 12. 8. 02:03

Objective-C Cocoa의 클래스 클러스터 (Class Cluster)


 어휴... 일전에 구매했던 objc 책에는 클래스 클러스터에 대해 언급이 되어있지 않아 완전 존재를 모르고 있었습니다.
 작업중에 NSMutableData확장으로 인스턴스 변수를 덧붙이기 위해서 상속받아 사용하는데 이건 뭐... 'only defined for abstract class. Define -[Class Method]!' 라는 exception 과 함께 어플이 죽어버리는 문제 때문에 "어?" 싶었습니다.

 다행이도 Class Cluster 라는 존재를 알게되었고 Cocoa Design Pattern 에서 Abstract Factory Pattern 을 이용한거라 하는데 뭐.. 워낙 영어가 짧아놔서 그 이외에는 상세한 내용을 알기도 전에 검색해보니 매우 상세히 블로깅 해두신 분 덕분에 쉽게 이해할 수 있었습니다.

상세한 설명은 아래 링크.
출처 링크 : http://sonofgrace.blog.me/100116111526

apple 의 developer center 의 reference guide에서 class cluster 에 관련하여 검색하면 상세히 나오나 영어로 되어있으니 주의하셔야합니다.

 추가 인스턴스 변수를 위한 상속을 이용하기 위해선 다음과 같은 방법을 애플에서 일러주고 있습니다.



대충 느낌이 오실겁니다.

원글을 참고하시려면 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW34

 졸려워서 머리도 안돌아가고 뭐라고 쓰는지도 모르겠고 -_-;