3

私は、iPhone 3.0、iPhone 4.0 用にデプロイしたいアプリを開発しており、iPad 上でエミュレート モードで実行できます。

私は XCode 3.2.3 で開発しており、再生するビデオがあります。MPMoviePlayerViewController>= 3.2 およびMPMoviePlayerController< 3.2で使用したいと思います。

私が使用する場合

Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) 
{
    MPMoviePlayerViewController* moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl];

   ...
}

OS 3.0 を搭載した iPhone は、未知のクラスを処理できますか?

__IPHONE_OS_VERSION_MIN_REQUIRED > 30200ifelse ブロック内にコードを入れるのは良いですか? このような:

Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
   MPMoviePlayerViewController* moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl];
    ...
}

しかし、__IPHONE_OS_VERSION_MIN_REQUIRED実際には何をしますか?プロジェクト用にセットアップした設定を繰り返すだけのように思えます: min=3.0

4

2 に答える 2

2

あなたは正しいです__IPHONE_OS_VERSION_MIN_REQUIRED:それはあなたがあなたのプロジェクトに入れたものです。したがって、#if使用するステートメントはコンパイル時に評価されますが、これは望ましくありません。

代わりに、最初に行ったことを実行しますが、いくつかの小さな変更を加えて、次のようにします。

Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
    id moviePlayerViewController = [[mplayerControllerClass alloc] initWithContentURL:movieUrl];
    ...
}

ポイントは、MPMoviePlayerViewControllerそれが存在することを確認したとしても、単独で使用すべきではないということです (いずれにせよ、適切にコンパイル/リンクするとは思いません)。ただし、OS 3.0 のデバイスでは問題なく動作します。(たとえば、Apple の OpenGL ES の例を参照してくださいCADisplayLink)。

于 2010-07-27T19:00:18.950 に答える
2

最初のスニペットでは、に基づいてクラスを作成していNSStringます。これは、古いバージョンの OS がこの状況でクラッシュしないように、フレームワークを弱いリンクにしているため可能です。これは実行時に行われ、期待どおりに機能します。

一方、2 番目のスニペットでは、プリコンパイラ条件を使用しています。MPMoviePlayerViewControllerを使用するためには 4.0 の Base SDK を使用することになるため、これは何の効果もありません。したがって、#ifは常に true になります。

結論: 弱いリンクが必要です。最初のスニペットに進み、フレームワーク弱いリンクであることを確認してください。

于 2010-07-27T19:03:39.740 に答える