添加委托给AVAudioPlayer原因“_NSAutoreleaseNoPool()类的对象0x55e060 NSCFString自动释放与地方没有游泳池 - 刚刚泄露”
-
12-09-2019 - |
题
我一直在使用一个类来播放使用AVAudioPlayer的声音。因为我要释放这些声音,他们的玩法之后,我添加了一个委托。这导致了“_NSAutoreleaseNoPool():类NSCFString自动释放与地方没有游泳池的对象0x55e060 - 刚刚泄露”。错误的声音完成播放后的权利,但在此之前我-audioPlayerDidFinishPlaying被称为
下面是一些来源:
@interface MyAVAudioPlayer : NSObject <AVAudioPlayerDelegate> {
AVAudioPlayer *player;
float savedVolume;
BOOL releaseWhenDone;
}
在主类的.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];
}
注释出[播放器setDelegate:自];让错误消失,但后来我audioPlayerDidFinishPlaying不会被调用。
任何想法?我现在会突然在另一个线程中运行?
解决方案
我发现这个问题。我的错误,当然。
在我的很多的类文件,我加入:
-(BOOL) respondsToSelector:(SEL) aSelector
{
NSLog(@"Class: %@ subclass of %@, Selector: %@", [self class], [super class], NSStringFromSelector(aSelector));
return [super respondsToSelector:aSelector];
}
主要出于好奇。
那么,当我添加了一个委托我的声音,那么这个方法被委托之前调用,它会从任何runloop的AVAudioPlayer发生称为是在和可能,与没有autorelease池一runloop。
不隶属于 StackOverflow