إضافة مفوض إلى Avaudioplayer السبب "_nsautoreleasenopool (): كائن 0x55E060 من فئة NSCFSTRING AUTORELODE مع عدم وجود تجمع في المكان - مجرد تسريب"

StackOverflow https://stackoverflow.com/questions/967206

  •  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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top