ruby/rubycocoa for iphone - uicoderz4

Post on 03-Dec-2014

7.794 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

this slide is written in Japanese iphone-rubycocoa project (in English): http://wiki.github.com/takuma104/iphone-rubycocoa

TRANSCRIPT

Ruby / RubyCocoafor iPhone

@takuma104

発端

iPhoneでC#(CIL)が動いてる

monoでAOTで動くらしい

じゃ

Rubyも(もちろん)動くよね??

では

移植

というかなんとか動かしたい

まずRubyの話

話はOS1.0.x時代 (JB)

Rubyを動かすのが流行った

irbうごかねーじゃん!!!

メモリ足りないで落ちる??

仕方無いのでeval.rbで楽しむ

…うむむ。

捨て

話は戻ってiPhoneSDK 2.x

ちょっと制限きつくなった

かも?

consoleがない

stdout/stderr はとりあえずXcodeのDebug出力

動的リンクできない

全部static link

アプリ外の領域のファイル読み書き不可

とかとか

configureとの格闘

とりあえずいらないヘッダ削る

削る

なんか要らないヘッダ

なんかマクロ

なんとか動いた (1.8.7)

samples/test.rbの8割動く

8割

Process.kill($$)できない

リソースフォルダにファイル書けない

外部のminiryby起動

できない

とりあえず動いたといっていいかな…

irbモドキをアプリにした

提出

待機

却下

理由

「どんなRubyのコードでも動いちゃう

っぽくね?(怒)」

(電卓とか作って出したらどうなるんだろう…)

あとで。

TODO

test/test_*.rb 動かす

irb動かす(ioをtelnet

で)

longjmp()なんか

おかしい問題

rubyの中だけで完結したraiseのrescueは問題ないっぽいが…

C側でrb_longjmpされたのが補足されないっぽい

組込

全部static linkにできたので

.h 5コぐらいと、.a 1コ

lib/用のtar1コ

(resource)

ruby_init()

rb_eval_string_protect()

Ruby Scriptを文字列で渡してやると実行してそのまま値を返す

くわしくはirbアプリのEvalRubyクラス参照

RubyCocoaのお話

RubyでCocoaを使える

?

ObjCな人から見たメリット(?)

ObjCメソッド呼び出し

[[UIViewalloc]initWithFrame(CGRectZero)]↓OSX::UIView.alloc.initWithFrame([0,0,0,0])

ほとんど書き方が一緒

かつ

[[ ]]

無い

!!!

つねにid型になってるイメージ

プリミティブ型は自動変換

構造体は?

配列からCGRectとか自動変換

delegationとか

どうなるの?

OSX::NSObjcetを継承したクラスは普通に受けられる

@interfaceHoge@end

@implementHoge‐applicationDidFinishLaunching(UIApplication*app){NSLog(“%s”,class_getName(app‐>isa));}@end

intmain(){returnUIApplicationMain(0,nil,nil,@”Hoge”);}

classHoge<OSX::NSObject defapplicationDidFinishLaunching(app) papp endend

OSX.UIApplicationMain(0,nil,nil,"Hoge")

classFuga<OSX::UIView definitialize @tv=OSX::UITableView.alloc.initWithFrame(OSX::UIScreen.mainScreen.bounds) @tv.setValue_forKey(self,"delegate") @tv.setValue_forKey(self,"dataSource") self.addSubview(@tv) end

deftableView_numberOfRowsInSection(tableView,section)return10end

deftableView_cellForRowAtIndexPath(tableView,indexPath)cellIdentifier="Cell"cell=tableView.dequeueReusableCellWithIdentifier(cellIdentifier)if(cell==nil)thencell=OSX::UITableViewCell.alloc.initWithFrame_reuseIdentifier([0,0,0,0],cellIdentifier)endcell.setValue_forKey(indexPath.row.to_s,"text")cellendend#thnaksto@hitoriblog

(そういえば)念願の

GC

参照カウンタ地獄からの

開放

そんなに上手くいかない?

欠点

ネイティブThread使えない

Rubyの使えばいいじゃない

t=Thread.newdop“hoge”end

t.join

Cocoaのセレクタ名が長いので

Rubyでも長さは変らないという話

‐tableView:(UITableView*)vcellForRowAtIndexPath:(NSIndexPath)i;

deftableView_cellForAtRowIndexPath(v,i)

どうしようもなさそう

プロパティのget/setの書き方長い

[UIApplicationsharedInstance].delegate↓OSX::UIApplication.sharedInstance.valueForKey(‘delegate’)

.delegate=self;↓.setValue_forKey(self,‘delegate’)

この書き方はプロパティと同じにできるかも?

ちなみに

HotCocoa.rb

MacRubyの一部分

PureRuby実装のCocoaラッパ

require'hotcocoa'includeHotCocoaappdowindow:title=>'HelloWorld',:frame=>[0,0,120,120]do|w|button:title=>'Clickme'do|b|b.on_action{puts'HelloWorld!'}w<<bendendend

詳しくは@lrzさんの資料参照

話は戻って

移植

最新(0.13.2)で

調査

まずlibffi動かないっぽい

orz

中川さん「古い実装ならlibffi使ってなかったと

思うよ?」

mjd

0.4.2まで使ってなかった

5年前の実装だけど0.4.2ベースで

ということで修正点

ObjC runtimeの構造体に直接をやめてAPI経由

にした

structobjc_methodstructobjc_ivar

とかはもはや使用できないらしい

動的クラス生成

objc_allocateClassPair()objc_registerClassPair()

クラスにメソッドを

追加

class_addMethod()

クラスにメンバ変数を追加

class_addIvar()

構造体などのスタブを生成しているRubyコードを修正

ObjC黒魔術vs

Ruby黒魔術

とりあえず

まだかなり不十分だけどhelloWorldレベルが動く

いちばんやりたかった事、それは…

リモートからirbで実機で動いてるアプリを動作中に変更する

Inspired byJSCocoaの

iPhone用インタラクティブコンソール

TCPサーバをRubyで書いてeval.rbに繋げただけ

(Macとかの) telnetから

コードを弄れる

デモ

githubのrepoで開発継続

今後

して

開発

可能

何か

纏め

Ruby楽しいよRuby

おしまい

top related