1

iPhone SDK 3.2では、[CLLocation getDistanceFrom:]名前がに変更されました[CLLocation distanceFromLocation:]。私のプロジェクトは、ベースSDKとして3.2を使用し、3.0の「デプロイターゲット」を使用してコンパイルされています。つまり、3.2でのみ使用可能なフレームワークは弱くリンクされているため、アプリは3.0でも実行できます。

新しい名前を使用するように呼び出しを変更すると、distanceFromLocation:3.0または3.1を実行しているデバイスで何が起こりますか?メソッド呼び出しは失敗して返されると思い0.0ます(Cocoaは認識されないセレクターのデフォルトを返すため)。

私の仮定が正しければ、これは、3.0をターゲットにしなくなるまで、今のところコンパイラの警告に耐えなければならないことを意味します。

4

1 に答える 1

3

新しい名前distanceFromLocation:を使用するように呼び出しを変更すると、3.0または3.1を実行しているデバイスで何が起こりますか?メソッド呼び出しが失敗し、0.0が返されると想定します(Cocoaが認識されないセレクターのデフォルトを返すため)。

いいえ、にメッセージを送信することを考えていますnil。セレクターを認識しないオブジェクトにメッセージを送信すると、例外が発生します。その例外をキャッチしないと、アプリケーションがクラッシュします。ユーザーはこれを気に入らないでしょうし、Appleはそれを超えてあなたのアプリを拒否するかもしれません。

解決策は、場所が新しいセレクターに応答するかどうかをテストすることです。

if ([here respondsToSelector:@selector(distanceFromLocation:)])
    distance = [here distanceFromLocation:there];
else if ([here respondsToSelector:@selector(getDistanceFrom:)])
    distance = [here getDistanceFrom:there];

ちなみに、これは実際にはリンクとは何の関係もありません。名前が変更されたクラスについて話している場合はそうなりますが、動的メッセージディスパッチは、Objective-Cの「メソッド呼び出し」(より正確には、オブジェクトへのメッセージ)がコンパイル時またはリンク時にバインドされないことを意味します。

于 2010-06-11T08:33:40.120 に答える