4

さて、私は1年以上iphoneアプリを開発してきましたが、それでも本当にひどいことが1つあります。

アプリをiOS3.0と互換性を持たせたいとしましょう。SDKを利用可能な最新バージョンに設定し、デプロイターゲットを3.0に設定します。

しかし、誤って... 3.1.x以降でのみ使用可能な関数を呼び出した場合はどうなりますか?そうです、それは単にクラッシュします。

関数が後のiOSバージョンでのみ使用可能であることを通知する警告やインジケーターはありません。また、エミュレータは4.0未満のバージョンをサポートしていないため、アプリケーションが実際に機能するかどうかをテストすることはできません。新しいiOSがすでにインストールされているため、新しいデバイスを購入することもできません。また、古いデバイスを使用している場合でも、コードのすべての部分をチェックすることがほとんど不可能な場合があります。

そして、私の顧客(約2/3)がまだ3.xバージョンを使用していることを知っているので、私は本当に古いバージョンをサポートする必要があります。

アプリ内で呼び出されるすべての関数の可用性をスキャンするコードアナライザーなどはありませんか?

あるケースでは、私が電話したためにアプリがクラッシュしました

+ (id)sortDescriptorWithKey:(NSString *)key ascending:(BOOL)ascending

これは、alloc+の便利な方法です。

- (id)initWithKey:(NSString *)key ascending:(BOOL)ascending;

(さらに、自動リリースされます)しかし、sortDescriptorWithKeyは4.0 @_@でのみ使用可能です。

4

3 に答える 3

2

ここで同じ質問。Base SDKプロジェクトとターゲットのを3.0に設定するために私が理解した唯一のこと。次に、コンパイラは、存在しないメソッドを呼び出すかどうかをチェックします。

ただし、上記の方法ではASI HTTPフレームワークを使用するとエラーが発生するため、スキャナーに関する質問はまだ存在します。だから私の手順は

  1. SDKを3.0に変更します
  2. 私自身のコードの根底にあるエラーを通過します
  3. 3.0互換になるようにメソッドを変更します
  4. プロジェクトBase SDKを最新のSDKに戻す

おそらく、以前のXCodeバージョンからSDK3.0をインストールする必要があります。Base SDKまた、ターゲットを最新バージョンに戻す必要はありません。一度3.0に設定しましたが、ASIHTTPからエラーは発生しません。

//編集:XCode 3.2.1のダウンロードリンク:SnowLeopardLeopard

于 2011-01-14T12:59:06.757 に答える
0

replysToSelectorメソッドを呼び出して確認してみてください

if([your_obj respondsToSelector:@selector(sortDescriptorWithKey:ascending:)]){
  // call sortDescriptorWithKey
}
else
{
  // call another method
}

コンパイル中に警告が表示されますが、実行時にクラッシュすることはありません。

于 2011-01-14T13:38:24.997 に答える
0

Appleのフレームワーク/ウィークリンクガイドで確立されたガイドラインを使用してみてください。@Andriyの回答のようにオブジェクトに質問できない関数の場合。

于 2011-01-14T15:25:37.913 に答える