실제로 쓰일 일은 극히 드물겠지만, Objective-C Runtime API를 이용하여 클래스를 생성할 수 있다.
다음의 코드는 어떤 클래스를 Runtime에서 복사하는 코드의 예제이다.
#include <objc/runtime.h>
+ (Class)copyClassWithName:(const char *)aClassName
{
Class sClass;
Ivar *sIvars;
Method *sMethods;
unsigned int sCount;
unsigned int i;
sClass = objc_allocateClassPair([self superclass], aClassName, 0);
sIvars = class_copyIvarList(self, &sCount);
for (i = 0; i < sCount; i++)
{
NSUInteger sSize;
NSUInteger sAlign;
NSGetSizeAndAlignment(ivar_getTypeEncoding(sIvars[i]), &sSize, &sAlign);
class_addIvar(sClass, ivar_getName(sIvars[i]), sSize, sAlign, ivar_getTypeEncoding(sIvars[i]));
}
free(sIvars);
sMethods = class_copyMethodList(self, &sCount);
for (i = 0; i < sCount; i++)
{
class_addMethod(sClass, method_getName(sMethods[i]), method_getImplementation(sMethods[i]), method_getTypeEncoding(sMethods[i]));
}
free(sMethods);
objc_registerClassPair(sClass);
return sClass;
}
이 예제 코드는 instance variable과 instance method만 복사하고 있다. 만약, 완벽한 복사를 원한다면, class method, property, protocol에 대해서도 비슷한 작업을 해줘야 한다.
지금까지 아무 불편함없이 잘 쓰고 있던 subversion대신에 새로운 마음으로 git을 한번 써보기로 했다.
Mac OS X에서 git소스를 받아 설치하는 것은 전혀 어려운 일이 아니었다. 하지만, 사용 중 manpage가 하나도 설치되어 있지 않은 것을 보고 확인해 보니 git소스를 빌드할 때 manpage는 기본적으로 설치하지 않는단다. 허허... 이런 일이...
고작, manpage하나 설치하는데, 이런 삽질을 하게될 줄은 전혀 몰랐다. 아래는 삽질의 정리된 결과물...
asciidoc-8.5.2 설치
다운로드: asciidoc-8.5.3.tar.gz
./configure make sudo make install
gettext-0.17 설치
아래의 getopt를 빌드할 때 libintl가 필요한데, libintl은 여기에 포함되어 있다.
다운로드: gettext-0.17.tar.gz
./configure make sudo make install
getopt-1.1.4 설치
아래의 xmlto를 빌드할 때 getopt가 필요하다.
다운로드: getopt-1.1.4.tar.gz
make LDFLAGS=-lintl sudo make install
docbook xml/xsl 설치
xmlto를 빌드할 때와 git manpage를 빌드할 때 필요하다. 에휴...
sudo mkdir -p /usr/local/share/docbook sudo mkdir -p /usr/local/etc/xml cd /usr/local/share/docbook sudo wget http://surfnet.dl.sourceforge.net/sourceforge/docbook/docbook-xsl-1.75.2.tar.bz2 sudo wget http://www.oasis-open.org/docbook/xml/4.2/docbook-xml-4.2.zip sudo wget http://www.oasis-open.org/docbook/xml/4.5/docbook-xml-4.5.zip sudo tar xjf docbook-xsl-1.75.2.tar.bz2 sudo unzip docbook-xml-4.2.zip -d docbook-xml-4.2 sudo unzip docbook-xml-4.5.zip -d docbook-xml-4.5 sudo rm docbook-xsl-1.75.2.tar.bz2 sudo rm docbook-xml-4.2.zip sudo rm docbook-xml-4.5.zip sudo xmlcatalog --noout --add nextCatalog '' file:///usr/local/share/docbook/docbook-xsl-1.75.2/catalog.xml --create /usr/local/etc/xml/catalog sudo xmlcatalog --noout --add nextCatalog '' file:///usr/local/share/docbook/docbook-xml-4.2/catalog.xml --create /usr/local/etc/xml/catalog sudo xmlcatalog --noout --add nextCatalog '' file:///usr/local/share/docbook/docbook-xml-4.5/catalog.xml --create /usr/local/etc/xml/catalog sudo ln -s /usr/local/etc/xml /etc/xml
xmlto-0.0.23 설치
이제 마지막으로 xmlto를 빌드한다.
./configure GETOPT=/usr/local/bin/getopt make sudo make install
git-1.7.0.5 설치
드디어 원하는 것이다.
./configure make sudo make install make man sudo make install-man
정말 오랜만의 블로그 포스팅이 이런 삽질의 결과물일 줄이야...
Xcode에는 Code Sense라는 멋진 소스 인덱싱 툴이 내장되어 있다. 하지만, 소스 편집기로 Emacs 등의 External Editor를 사용한다면 Code Sense는 별로 도움이 되지 않는다. Code Sense 데이터베이스에 접근할 수 있는 툴을 Apple이 만들어 주지 않는한 외부 편집기에서 Code Sense를 활용할 수 있는 방법은 없는 듯 하다.
그래서, 이번에는 GNU GLOBAL이 Objective-C를 대충 해석할 수 있도록 패치를 해 보았다.
원래 GNU GLOBAL은 소스파일을 해석해서 tag를 출력해주는 툴을 아무거나 붙일 수 있도록 되어 있다. 즉, Exuberant Ctags를 사용하여 tagging하고 global을 이용하여 query할 수도 있다는 말이다. 그래서, 처음에는 Objective-C 소스파일에서 tag를 출력해주는 툴을 만들어 GNU GLOBAL에 붙일까 생각했었는데, 귀차니즘이 발동하여 GNU GLOBAL의 C++ 파서를 대충 수정하여 Objective-C tag를 출력하도록 하였다.
한가지 아쉬운 것은 Objective-C 메소드에 대한 reference tag 검색이 안된다는 것. 이건 작업할려다가 포기했다!
아! 실력이 미천하여 버그가 엄청 많이 있을 수 있다!
이 글은 스프링노트에서 작성되었습니다.



global-5.7.6-objc.tar.bz2