• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:iPhone開発について)

iPhone開発についての質問

このQ&Aのポイント
  • iPhone開発についての質問です。AVAudioPlayerを利用したボタンタップで音が鳴り、再びタップで音を止める動作を実装したいのですが、止める処理が思い通りに動きません。
  • 質問内容は、xCode4でxibを利用している変数hogeFlgとAVAudioPlayerを使い、ボタンタップで音を再生、再びタップで音を止めるという動作を実装したいが、止める処理がうまく動かないというものです。
  • また、xibを利用しているために起動時にviewDidloadを読み込むかどうかもわからず、解決策がわからない状況です。

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

> また、xib を利用しておりますので、起動時に、- (void)viewDidload を読み込むのかな? > と思い、入れてみたのですが通っておりません。 なにを「入れてみた」のですか?指示しているものがないので、意味が通じません。 それを置いておいても、ひじょうにあぶないコードであることは、まちがいありません。 Objective-Cでは、インスタンス(オブジェクト)を代入する変数がポインタであることはおわかりですね? ボタンを押すたびに「AVAudioPlayer *oto = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];」とインスタンスを新規生成していると、現在再生中のインスタンスを指し示すポインタが、「oto」でなくなってしまうため、メソッドによる制御が不能になってしまいます。まあ、停止できなくなって、とうぜんといえばとうぜんです。おなじサウンドリソースから生成したインスタンスだから、おなじインスタンスと考えるのは、間違いだということはわかりますね? Objective-Cで、C言語におけるグローバル変数と同等のものを使いたければ、インスタンス変数として、ヘッダファイル(@interface)に記述します。 AVAudioPlayerのインスタンスは、ファイルから読み込んで、再生可能な状態にするまで時間がかかるので、再生する前に前もって生成しておき、「prepareToPlay」メソッドで準備させておくことが肝心です。ここらへんの過程は、View Controllerクラスの「viewDidLoad:」メソッド内で処理しておくといいでしょう。 AVAudioPlayerクラスに限らず、生成したインスタンスは、使い終わったあとかならずバッファ開放することを心がけてください。これはオブジェクトのライフサイクルといって、Objective-Cだけでなく、オブジェクト指向言語すべてにあてはまることです。いつインスタンスを開放したらいいのかはっきりしないときのために、Objective-Cでは「dealloc」というメソッドが用意されており、このメソッド内でいつ開放したらいいのかはっきりしないインスタンスを開放するコードを書くようになっています。

RYO-88
質問者

お礼

ありがとうございました。 >なにを「入れてみた」のですか?指示しているものがないので、意味が通じません。 失礼致しました。メソッド自体です。 ご回答頂いた内容を調べながら修正して行きます。 ありがとうございました。

その他の回答 (1)

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

> 失礼致しました。メソッド自体です。 メソッドとは、なにをするメソッドですか?指示しているものが書いていないという意味では、私の質問に対する回答になっておりません。

RYO-88
質問者

お礼

-(void)viewDidLoad でも確認した所、動きました。 ちょこちょこ触っていたので、結局なぜ最初動かなかったのかが分からず気持ちが悪いですが、とりあえず解決できました。 本当に助かりました。ありがとうございます。

RYO-88
質問者

補足

はじめは、-(void)viewDidLoad に以下を入れておりました。 NSString *path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"mp3"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *oto = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; -(void)viewDidAppear:(BOOL)animated に入れましたら、思い通り動くようになりました。 -(void)viewDidLoad は、初回ロードされた時のみ -(void)viewDidAppear:(BOOL)animated は、画面が表示された後 に呼び出されていると思っていたのですが、2つは何か動きが違うのでしょうか。

関連するQ&A