Xcode 4.2 でビルドしたバイナリが iPhone 3GS で実行時エラーになる : Objective-C プログラミング

PROGRAM


Xcode 4.2 でビルドしたバイナリが iPhone 3GS で実行時エラーになる

以前に iOS 5 SDK が搭載された Xcode 4.2 でビルドしたバイナリが iOS 4.3.5 を搭載した iPhone 3GS で正しく実行できないことがありました。

それについては一度 Xcode 4.2 でビルドしたバイナリを iPhone 3GS で実行できない場合 で記した方法で解消したかのように思えたのですけど、立て続けにまた、別の原因で iPhone 3GS + iOS 4.3.5 で実行できない場面がありました。

エラーの状況

今度は、以前とは違って、自分で記載したソースコードまで実行が進んでくるのですけど、静的ライブラリに組み入れたクラスメソッドを呼び出した時点で、実装されていないということで、エラーとなってしまいました。

2011-11-13 17:15:15.837 EzIPPhone4[666:707] *** NSInvocation: warning: object 0x19cea0 of class 'EzUISupport' does not implement methodSignatureForSelector: -- trouble ahead

2011-11-13 17:15:15.846 EzIPPhone4[666:707] *** NSInvocation: warning: object 0x19cea0 of class 'EzUISupport' does not implement doesNotRecognizeSelector: -- abort

静的ライブラリは組み込まれているはずなので、他に考えられる原因としては、以前に 静的ライブラリ内のカテゴリされた関数が呼び出せない でお話した "-ObjC" リンカーオプションも試してみたのですが、それでも改善しませんでした。

エラーの原因

調べてみると、今回呼び出したクラスメソッドを実装しているクラスがどこからも派生していないことが原因でした。

どうやらどこからも派生していないがために、スタティックライブラリか、またはそれを読み込んでいるプロジェクトのどちらかで、実装がないものとして扱われて、適切なコードが読み込まれなかった様子です。

 

今回のクラスメソッドは、クラスメソッドしか持たない作りだったのと、iPhone 4S + iOS 5.0 でビルドした場合は正しく実行できていたのもあって、そのクラスを NSObject から派生させていなかったのですが、これが問題でした。

@interface EzUISupport : NSObject

{

}

 

+ getSimilarColor:(UIColor*)color brightness:(CGFloat)brightness;

 

@end

このような感じで NSObject から派生させたり、NSObject から派生された別のクラスから派生させたりして、普通に実装してあげれば、今回のような実行時エラーは発生しなくなりました。

[ もどる ]