RubyCocoa로 ruby객채를 obj-c에서 사용하기
OSXDEV
Media:Example.oggMac OS X 10.5에 기본 내장된 흥미로운 기능 하나는 Python이나 Ruby같은 스크립팅 랭귀지를 이용해서 Cocoa를 사용할 수 있게 해 주는 PyObjC와 RubyCocoa가 번들되어있다는 점입니다. 이들 프레임웍들은 Full-bridge인데, 흔히 제공되는 언어 바인딩과 달라서 단순히 API들을 특정 언어로 export한 것이 아니라 두 언어의 실행환경이 쌍방향으로 서로 액세스가 가능하다는 점이 특징입니다.
저는 Ruby언어를 애용하는데, RubyCocoa의 주 이용자 층인 Ruby프로그래머들이 Ruby를 (당연히도) 사랑하다보니 인터넷에 있는 RubyCocoa자료들은 백이면 백 Ruby언어를 이용해서 Cocoa를 쓰는 내용이고, 그 반대로 objc에서 Ruby객체를 이용하는 방법에 대해서는 자료가 전무한 실정입니다. 그래서 제가 이것저것 실험해 본 결과를 여기에 남겨두고자 합니다. 행여나 누군가 저와 같은 일을 하려 한다면 도움이 될지도 모르니까요. ;)
1. RubyCocoa를 이용하려면 당연하게도 먼저 RubyCocoa프래임웍을 링크해야 합니다. SDK를 사용하시길 원하시면 /Developer/SDKs/MacOS10.5.sdk/System/Library/Frameworks/RubyCocoa.framework 을 Xcode 프로젝트에 추가해 주시면 되고, SDK가 필요없으신 분은 /System/Library/Framework/RubyCocoa.framework을 쓰셔도 됩니다.
2. RubyCocoa는 쓰기전에 초기화 되어야 합니다. 세가지 초기화 method들이 <RubyCocoa/RubyCocoa.h>파일에 정의되어 있는데, 코드 번들인지, objc어플리케이션인지, Ruby어플리케이션인지에 따라 적절한 것을 쓰시면 됩니다. 이 문서는 objc에서 ruby코드를 부르기 위한 것이므로, 첨부된 샘플 프로그램은 +(int)applicationInitWithProgram: argc: argv: param 메소드를 사용합니다.
3. 루비 객체를 objc에서 쓰는 방법은 두가지가 있습니다. 첫번째 방법은 루비 클래스를 evaluate한 후 objc의 런타임 API를 통해 그 클래스를 이용하는 것입니다. 자세한 것은 샘플 코드를 참조해 주세요.
4. 순수 루비 객체, 즉 OSX로 시작하지 않는 객체들은 NSProxy의 서브클래스인 RBObject를 이용해서 사용 할 수 있다고 합니다...만, Mac OS X 10.5.2에 번들된 RubyCocoa에서는 정상적으로 동작하지 않습니다. 루비코코아 개발자들도 루비에서 Cocoa를 이용하는 것을 주 목적으로 생각하기 때문에 (...그래서 이 문서가 쓰여졌죠), 이 기능을 그리 중요히 생각하지 않는모양입니다. 그래서 이 RBObject는 태스트도 제대로 안되고 있는 모양입니다.
샘플 프로젝트 다운로드 Media:rbtest.zip [..']




