2011年10月23日日曜日

libSystem.B.dylibってなんだろう

これまで作ってきた iPhone アプリは、何とか iOS 3 デバイスでも動くように作ってきました。
しかし、現在開発中のアプリを iOS 3 デバイスでテストしてみると、以下のようなメッセージがコンソールに出て停止してしまいます。
dyld: Symbol not found: __NSConcreteStackBlock
  Referenced from: 〜省略〜
  Expected in: /usr/lib/libSystem.B.dylib
NSConcreteStackBlock ってなんですか?
なんだろうと思って調べたら、Blocks が原因だと分かりました。

Blocks 引用
ブロックオブジェクトは、C言語レベルの構文によるランタイム機能です。標準Cの関数に似ていま すが、実行可能なコードのほかに、自動(スタック)メモリまたはマネージド(ヒープ)メモリに バインドされている変数を含むことができます。したがって、ブロックでは、実行時の動作に影響 を与える状態(データ)セットを維持できます。
Blocks は iOS 4 から導入されました。
今回、初めて自アプリで GameKit を使用する際に Blocks を使っていました。

GameKit フレームワークは iOS 3デバイスには無いので、その際、無視出来るように、リンク設定で Optional (Xcode 3時代のWeakと同じ意味らしい) に設定していましたが、 どうやらこの libSystem.B.dylib も Optional に設定しないといけないらしいです。
設定方法は、下記画像を参考にして下さい。

libSystem.B.dylib を Optional にすると、iOS 3デバイスでも実行することができました。

とは言え、もうそろそろ iOS 3 が乗っている古いデバイスでは、処理速度的に対応が難しくなってきました。次回のアプリからは iOS 4 以上を対象にしたいと思っています。

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...