2011-08-04 8 views
0

これを修正する方法を教えてください。彼らが演奏を終えたときに2つの異なったものをリリースしたいと思います。2つの「audioPlayerDidFinishPlaying」を使用できません

ここに私のコードです:

.hファイル

@interface ViewController : UIViewController <AVAudioPlayerDelegate> 
{ 
    NSString   *path; 
} 

- (IBAction)Short:(id)sender; 
- (IBAction)BeatLong:(id)sender; 

.mファイル

AVAudioPlayer *media; 
AVAudioPlayer *media2; 

- (IBAction)Short:(id)sender 
{ 
    path = [[NSBundle mainBundle] pathForResource:@"Short" ofType:@"wav"]; 
    media = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
    [media setDelegate:self]; 
    [media play]; 
} 

- (IBAction)Beat:(id)sender 
{ 
    path = [[NSBundle mainBundle] pathForResource:@"Beat" ofType:@"mp3"]; 
    media2 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
    [media2 setDelegate:self]; 
    [media2 play]; 
} 

.m

(新しいトンで画像を開きます。 abをもっとよく見て^^、)

+0

は、私はあなたの返事のため – Aluminum

答えて

2

いいえ、言い換えれば、それは違法です。

AVAudioPlayer *ポインタ にメッセージを送信して、異なるプレイヤーを区別する必要があります。

あなただけのただ

- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)aPlayer successfully:(BOOL)flag 
{ 
    [aPlayer release]; 
} 

を書いて、あなたがaPlayerを所有していないので、あなたは、あまりにも行われ、違法だ、それを解放します。

ただし、あなたが所有しているオーディオプレーヤーを検出してリリースする方がよい方法です。

- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)aPlayer successfully:(BOOL)flag 
{ 
    if (aPlayer == self.media) 
     [self.media release]; 
    else if (aPlayer == self.media2) 
     [self.media2 release]; 
    // other players cannot be released, since we don't know anything about their owner. 
} 
+0

おかげで:-)多くのコードを追加しましたが、Xcodeは言う:プロパティ「メディア」は型のオブジェクトには見られない「のViewController *」@小便の第2のサンプルコードは、メディアとMEDIA2を想定しているためだ – Aluminum

+2

をおそらくあなたがそれらを実装するべき方法である、保持されたプロパティです。あなたのサンプルコードでは、それらは単にグローバル変数です。 –

+1

はい、保持リリースは、@合成時に生成されたアクセサによって部分的に管理されるので、ずっと簡単です。 – Wizz

関連する問題