2009-06-08 10 views
1

Ich habe eine Klasse verwendet, um Sounds mit AVAudioPlayer zu spielen. Da ich diese Sounds sofort nach dem Abspielen freigeben möchte, habe ich einen Delegierten hinzugefügt. Das verursacht ein "_NSAutoreleaseNoPool(): Object 0x55e060 der Klasse NSCFString Autoreleased mit keinem Pool an Ort und Stelle - nur Leaking" -Fehler, nachdem der Sound die Wiedergabe beendet, aber bevor my -AudioPlayerDidFinishPlaying aufgerufen wird.Hinzufügen von Stellvertreter zu AVAudioPlayer Ursache "_NSAutoreleaseNoPool(): Objekt 0x55e060 der Klasse NSCFString Autoreleased ohne Pool an Ort und Stelle - nur undicht"

Hier sind einige Quellen:

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

Die Hauptklasse .m:

- (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]; 
} 

die [Spieler setDelegate: self] kommentierte heraus; macht den Fehler weg, aber dann wird mein audioPlayerDidFinishPlaying nicht aufgerufen.

Irgendwelche Gedanken? Bin ich plötzlich in einem anderen Thread?

+1

Können Sie den Code auf die kleinste Probe reduzieren, die das Problem auslöst? – zoul

Antwort

0

Ich habe das Problem gefunden. Mein Fehler natürlich.

In vielen meiner Klassendateien, war ich hinzufügen:

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

} 

Hauptsächlich von curiousity aus.

Nun, als ich einen Delegierten zu meinen Sound hinzugefügt, dann wird diese Methode vor den Delegierten genannt und von was auch immer Runloop in sein die AVAudioPlayer passiert aufgerufen wird, und wahrscheinlich ein Runloop ohne Autofreigabepool.