2

Objective C でカスタム ビルドされたクラスを使用するのに本当に苦労しています。問題なく作成できますが、それらを使用して (MPMoviePlayerController クラスを使用して) ビデオを再生するなどの操作を行うとすぐに、メモリ割り当ての問題が発生します。メモリ管理に関する Apple 独自のドキュメントを読み、再読し、さまざまなオンライン チュートリアルを読み、ここで多くの質問をして読みました。しかし、同じメモリ割り当ての問題が何度も発生し続けます。

これまでのところ、すべてのコードを AppDelegate クラスに移動することでメモリの問題を解決してきました (これは正しいことではないと感じています。AppDelegate クラスをオーバーロードしたくありません)。AppDelegate クラスのすべてのプロパティは、期待どおりに動作します。

しかし、特定のタスクを処理するために独自のクラスを作成するとすぐに、一部のプロパティが予期せず解放されます (すべてのプロパティは強力であると宣言されていますが、使用中にまだ解放されています)。たとえば、ビデオを再生するオブジェクトを保持するプロパティは、ビデオの再生中に解放されます。これがどのように、またはなぜ起こっているのかわかりません。

私は根本的に間違ったことをしていると感じています。

私はしばらく前からこれを理解しようとしてきました (私の過去の質問を参照してください) が、何をしても EXC_BAD_ACCESS の問題に遭遇します。私はそれをしたくありません。

このようなオープンエンドの質問をするのは気の毒ですが、私が利用できる他の選択肢を使い果たしたように感じます.

MPMoviePlayerController を使用して Web サーバーからビデオを再生するクラスを作成する正しい方法を、誰かが最初から教えてくれませんか? 何も予期せずに解放されることはなく、必要なときにすべてがメモリ内にあります (つまり、ビデオがまだ再生されている間)。

この質問をして申し訳ありませんが、この問題に数か月苦労した後、他に何ができるかわかりません。

前もって感謝します。

4

1 に答える 1

2

MPMoviePlayerController を正しく使用するには、いつビデオを再生するか、ムービー プレーヤーの表示と非表示を処理する方法、およびいつ何かを表示するかを決定する必要があります。最後に、サンプル プロジェクトを使用してそれを行う方法の 1 つを説明します (下にスクロールするとダウンロード リンクが表示されます)。プロジェクトを自由に使用して、好みに合わせて変更してください。

最も重要な部分は、カスタム ビュー コントローラー (またはカスタム ビュー コントローラー内で使用されるカスタム クラス) のプロパティとして宣言し、MPMoviePlayerController明示的に (またはビュー コントローラーを閉じるなどして暗黙的に) カスタムの割り当てを解除しないことです。クラス、カスタム ビュー コントローラー、またはMPMoviePlayerControllerそれらが完了するまで。

すべてのコードをアプリ デリゲートに配置することは、一般的に適切な設計ではありません。コードを広げて、モジュール化して読みやすくしたい。

付属の .xib を使用して、基本的な XCode プロジェクトから始めます。File > New > File次に、左側から Cocoa Touch を選択し、Objective-C クラスを選択して、カスタム ビュー コントローラー (インターフェイス用の .h、実装用の .m、およびユーザー インターフェイス用の .xib ファイル) を作成します。[次へ] をクリックし、ファイルに名前を付けますMyMovieViewController。「ユーザーインターフェイスにXIBを使用」ボックスにチェックを入れます。

次に、アプリ デリゲートを変更します。

AppDelegate.h で、カスタム ビュー コントローラーのプロパティを追加します。

@property (nonatomic, strong) MyMovieViewController
    *myMovieViewController;

AppDelegate.m の -application:didFinishLaunchingWithOptions: 関数で、カスタム ビュー コントローラーを初期化しMyMovieViewController、「ルート ビュー コントローラー」として初期化された UINavigationController を宣言します。

self.myMovieViewController = [MyMovieViewController alloc] initWithNibName:@"MyMovieViewController" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:myMovieViewController];
        self.window.rootViewController = nav;

次に、アプリケーションのウィンドウのルート ビュー コントローラーをこの UINavigationController に設定します。ViewController で初期化された UINavigationController を「ルート ビュー コントローラー」として宣言します。アプリ デリゲートの関数の最後の行は、次のようになります。

[self.window makeKeyAndVisible];

さて、良いものに。これで、カスタム ビュー コントローラーができましたMyMovieViewController

MyMovieViewController.h、プロパティとしてMPMoviePlayerController呼び出されるようにします。mpController

@property (nonatomic, strong) MPMoviePlayerController *mpController;

のviewDidLoadMyMovieViewController.m関数で、 をインスタンス化しますmpController

NSString *urlString =@"...";  //your url here
NSURL *url = [NSURL URLWithString:urlString];
self.mpController = [[MPMoviePlayerController alloc] initWithContentURL:url];

MyMovieViewControllerの xib に2 つのボタンを作成し、それらを -(IBAction)showControllerButtonPressed:(id)sender および -(IBAction)hideControllerButtonPressed:(id)sender にリンクします。どちらも .m ファイルに実装されています。

-(IBAction)showControllerButtonPressed:(id)sender に、次を追加します。

self.mpController.view.frame = CGRectMake(0,0,320,320); //your size here
[self.view addSubview:self.mpController.view];
[self.mpController prepareToPlay];
[self.mpController play];

これにより、正しいサイズが設定され、コントローラのビューがカスタム ビュー コントローラのビューのサブビューとして追加され、ムービーが準備されて再生されます。

-(IBAction)hideControllerButtonPressed:(id)sender に、次を追加します。

[self.mpController pause];
[self.mpController.view removeFromSuperview];

これにより、ビデオが一時停止し (オーディオとビデオの再生が停止します)、コントローラーのビューがカスタム ビュー コントローラーのビューから削除されます。

AppDelegateのルート ビュー コントローラーとして追加したため、プロパティmpControllerはプログラムの存続期間中存続します。を表示して却下し、毎回ムービーをリロードする場合は、却下するときに = nil を設定する必要があります。MyMovieViewControllerMyMovieViewControllerUINavigationControllerMyMovieViewControllermpController

mpControllerビューが表示されたり、消えたり、バックグラウンドになったりするときに、一時停止して再生するように指示することもできます。

MPMoviePlayerControllerカスタム ビュー コントローラーのプロパティとしての を示すサンプル プロジェクトを次に示します。(注: このプロジェクトにはもう 1 つのビューコントローラーがあり、MPMoviePlayerController.関連するクラスが割り当てられ、割り当て解除されます):ViewControllerMyMovieViewControllerMPMoviePlayerController

http://www.filedropper.com/examplemovie-xcode5-ios7

于 2013-11-25T23:15:40.803 に答える