외규장각 도서 환수 모금 캠페인
BLOG main image
분류 전체보기 (47)
컴퓨팅환경 (18)
프로그래밍 (18)
놀이 (2)
잡담 (7)
«   2012/01   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
22,195 Visitors up to today!
Today 0 hit, Yesterday 13 hit
daisy rss
meet me at me2DAY
나눔글꼴 내려받기
tistory
2010/07/02 14:07

실제로 쓰일 일은 극히 드물겠지만, 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에 대해서도 비슷한 작업을 해줘야 한다.

 

2010/04/22 14:56

지금까지 아무 불편함없이 잘 쓰고 있던 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


정말 오랜만의 블로그 포스팅이 이런 삽질의 결과물일 줄이야...

 

2009/11/13 18:21

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 검색이 안된다는 것. 이건 작업할려다가 포기했다!

아! 실력이 미천하여 버그가 엄청 많이 있을 수 있다!

 

이 글은 스프링노트에서 작성되었습니다.

prev"" #1 #2 #3 #4 #5 ... #16 next