إضافة مفوض إلى Avaudioplayer السبب "_nsautoreleasenopool (): كائن 0x55E060 من فئة NSCFSTRING AUTORELODE مع عدم وجود تجمع في المكان - مجرد تسريب"
-
12-09-2019 - |
سؤال
لقد كنت أستخدم فئة لتشغيل الأصوات باستخدام AvaudiopLayer. منذ أن أرغب في الافراج عن هذه الأصوات مباشرة بعد لعبها، أضفت مندوبا. يسبب ذلك "_nsautoreleasenopool (): كائن 0x55e060 من الفئة NSCFSTRING AUTOREALD مع عدم وجود تجمع في مكان - مجرد تسريب" خطأ مباشرة بعد اكتمال الصوت تشغيل اللعب، ولكن قبل استدعاء My -AudioPlayerdidDidfinishplaying.
هنا بعض المصادر:
@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: الذات]؛ يجعل الخطأ يزول، ولكن بعد ذلك، لا يتم استدعاء My AudioplayerdiddidDInishplaying.
أي أفكار؟ هل سأكتشف فجأة في مؤشر ترابط آخر؟
المحلول
لقد وجدت المشكلة. علة بلدي، بالطبع.
في الكثير من ملفات الفصل الدراسي، كنت أضيف:
-(BOOL) respondsToSelector:(SEL) aSelector
{
NSLog(@"Class: %@ subclass of %@, Selector: %@", [self class], [super class], NSStringFromSelector(aSelector));
return [super respondsToSelector:aSelector];
}
أساسا خارج الفضول.
حسنا، عندما أضفت مندوبا إلى صوتي، فإن هذه الطريقة يتم استدعاؤها قبل المندوبين، ويتم استدعاءها من كل ما حدث avaudioplayer في أي وقت يتعلق به، ومن المحتمل أن يكون راضيا مع عدم وجود تجمع Autorelease.