2009-06-08 3 views
1

AVAudioPlayerを使用してサウンドを再生するクラスを使用しています。彼らが演奏された直後にこれらのサウンドをリリースしたいので、私はデリゲートを追加しました。そのため、サウンドが再生された直後ではなく、-audioPlayerDidFinishPlayingが呼び出される前に、「_NSAutoreleaseNoPool():NSCFStringクラスのオブジェクト0x55e060が、プールなしで自動解放されました - ただ漏れています」というエラーが発生します。 [プレーヤsetDelegate:自己]コメントアウトAVAudioPlayerにデリゲートを追加すると、 "_NSAutoreleaseNoPool():クラスNSCFStringのオブジェクト0x55e060がプールなしで自動再生されました - ただ漏れ"

- (MyAVAudioPlayer *) initPlayerWithName: (NSString *) name; 
{ 
    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource: name ofType: @"caf"]; 

    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; 

    player = [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL error: nil]; 
    [fileURL release]; 
    [player prepareToPlay]; 
    return (self); 
} 
- (MyAVAudioPlayer *)getAndPlayAndRelease:(NSString *)name withVolume:(float) vol; 
{ 
    MyAVAudioPlayer *newMyAVPlayer = [self initPlayerWithName:name]; 
    player.volume = vol; 
    [player play]; 
    releaseWhenDone = YES; 
    [player setDelegate: self]; 
    return newMyAVPlayer; 
} 
+ (void) getAndPlayAndReleaseAuto:(NSString *)name withVolume:(float) vol; 
{ 
    MyAVAudioPlayer *newMyAVPlayer = [[MyAVAudioPlayer alloc] getAndPlayAndRelease:name withVolume:vol]; 
// [newMyAVPlayer autorelease]; 
} 

#pragma mark - 
#pragma mark AVAudioPlayer Delegate Methods 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)playedPlayer successfully:(BOOL)flag { 
    if (releaseWhenDone) { 
     NSLog(@"releasing"); 
     [playedPlayer release]; 
//  [self release]; 
     NSLog(@"released"); 
    } 
} 

- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error { 
    NSLog(@"Error while decoding: %@", [error localizedDescription]); 
} 

- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player { 
    NSLog(@"Interrupted!"); 
} 

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player { 
    NSLog(@"EndInterruption!"); 
} 

- (BOOL) play; 
{ 
    player.currentTime = 0.0; 
    return [player play]; 
} 

@interface MyAVAudioPlayer : NSObject <AVAudioPlayerDelegate> { 
    AVAudioPlayer *player; 
    float   savedVolume; 
    BOOL   releaseWhenDone; 
} 

メインクラス.M:ここ

は、いくつかの供給源です。エラーをなくしますが、私のaudioPlayerDidFinishPlayingは呼び出されません。

どのような考えですか?私は突然別のスレッドで動作していますか?

+1

問題を引き起こす最も小さなサンプルにコードを減らすことはできますか? – zoul

答えて

0

問題が見つかりました。もちろん私のバグ。私のクラスファイルの多くで

、私が追加しました:

-(BOOL) respondsToSelector:(SEL) aSelector 
{ 
    NSLog(@"Class: %@ subclass of %@, Selector: %@", [self class], [super class], NSStringFromSelector(aSelector)); 
    return [super respondsToSelector:aSelector]; 

} 

を主に好奇心の外に。

音に代理人を追加すると、このメソッドはデリゲートの前に呼び出され、AVAudioPlayerが実行されたrunloopから呼び出されます。おそらく、自動解放プールのないrunloopから呼び出されます。

関連する問題