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?
Können Sie den Code auf die kleinste Probe reduzieren, die das Problem auslöst? – zoul