Hinzufügen von Delegierten zu AVAudioPlayer Ursache „_NSAutoreleaseNoPool (): Object 0x55e060 der Klasse Autoreleased NSCFString ohne Pool an Ort und Stelle - undichten nur“

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

  •  12-09-2019
  •  | 
  •  

Frage

Ich habe eine Klasse unter Verwendung von Klängen AVAudioPlayer zu spielen. Da ich diese Klänge freigeben wollen direkt nach dem sie gespielt werden, fügte ich einen Delegierten. Das führt zu einem „_NSAutoreleaseNoPool (): Object 0x55e060 der Klasse NSCFString ohne Pool anstelle Autoreleased - nur undicht“. Fehler direkt nach dem Ton zu spielen abgeschlossen ist, aber vor meiner -audioPlayerDidFinishPlaying heißt

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

Kommentar aus dem [Spielern setDelegate: self]; weggehen macht den Fehler, aber dann hat mein audioPlayerDidFinishPlaying nicht aufgerufen.

Alle Gedanken? Bin ich plötzlich in einem anderen Thread ausgeführt wird?

War es hilfreich?

Lösung

Ich fand das Problem. 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];

}

Vor allem aus Neugier.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top