この記事は RubyMotion Advent Calendar 2012の二日目の記事です。

第2回RubyMotionもくもく会でYahoo! iOSマップSDKのサンプルをRubyMotionに翻訳していて
http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/iphonesdk/tutorial2.html

YMKCoordinateRegionMakeのところで

Undefined symbols for architecture i386:
  "___concrete__YMKCoordinateRegionMake", referenced from:
      _MREP_F77F7B4AA08045E9933EBA24E7FDF1CA in app_delegate.rb.o
  "___concrete__YMKCoordinateSpanMake", referenced from:
      _MREP_F77F7B4AA08045E9933EBA24E7FDF1CA in app_delegate.rb.o
ld: symbol(s) not found for architecture i386

こんなエラーで落ちます。何を言ってるのか分からなかったのですがWatsonさんのおかげでサードパーティーのライブラリのマクロは自動で定義されないので存在しないことが分かりました。

大文字で始まっているのですぐ気づいても良さそうなものですが、このときは全然気づかなかった(汗)

本題はそこではなくて、frameworkのヘッダファイルからYMKCoordinateRegionMakeを探して同じ事をするメソッドを定義する際にC構造体の扱いがすぐに分からなかったこと。

該当ヘッダファイルの内容はこうでした。

マクロじゃなくてstatic inlineな関数でしたが同じ事なのでしょう。

このYMKCoordinateSpan構造体のオート変数としてspanを定義するところです。

構造体変数はframework内で使われているので勝手に他のもの代替するわけにはいきません。YMKCoordinateSpan構造体としてのアクセス領域が必要です。

これはPointerを使えば回避できます。
http://www.rubymotion.com/developer-center/guides/runtime/#_pointers

元のプログラムはオート変数を生成して値を設定しそのまま返して、値をコピーして利用している。同じ事をするためにYMKCoordinateSpan型のポインタを作ったら#valueで値を取得して使用します。([0]で値にアクセスしてもいいですが)

これでバッチリ動作するようになりました。

余談ですが、再定義しても上記のようにメソッド名をYMK...からymk...と小文字に変えないと動きませんでした。static inlineの方の定義が使えないのに名前としては参照できるからという事でしょうか...(・ω・)