【问题标题】:How to release the AVAudioPlayer in the below code如何在下面的代码中释放 AVAudioPlayer
【发布时间】:2011-04-14 08:34:00
【问题描述】:

我想释放我为 AVAudioPlayer 分配的内存,但是当我试图释放它时,声音没有播放。这是潜在的内存泄漏,我该如何摆脱这种情况。

下面的代码在选择错误选择时使用然后我正在播放错误声音,如果我选择多次错误选择然后它被分配多次那么我该如何摆脱这个。

        else
        {
            NSString *soundName=@"Error.mp3";

            NSError *error;
            NSURL *urlString = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%s", [[NSBundle mainBundle] resourcePath],[soundName UTF8String]]];

            AVAudioPlayer *worngAudioPlay = [[AVAudioPlayer alloc] initWithContentsOfURL:urlString error:&error];// here I also used to release using autorelease then not played sound

            worngAudioPlay.delegate = self;

            if (worngAudioPlay == nil)
            {
            }
            else
            { 
                [worngAudioPlay play];
            }
            // [worngAudioPlay release]; // Here I released then not played sound
        }

谢谢你, 马丹·莫汉。

【问题讨论】:

    标签: objective-c cocoa-touch memory-leaks avaudioplayer


    【解决方案1】:

    您可以在名为 audioDidFinishPlaying 的 avaudio 播放器委托方法中释放。我不知道确切的名字。但你可能明白我在说什么

    【讨论】:

    • 嗨,但是当我停止时,不会调用此方法。
    • @Madan Mohan 阅读了文档我不记得确切的方法名称。您会在 avaudioplayer 类文档中找到这一点
    【解决方案2】:

    让它成为你的类的保留属性,并在 dealloc 中释放它。

    在你的头文件中:

    @property(retain)AVAudioPlayer *player;
    

    在您的实现 (.m) 文件中:

    @synthesize player;
    

    在您上面的代码中:

    else
    {
        NSString *soundName=@"Error.mp3";
    
        NSError *error;
        NSURL *urlString = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%s", [[NSBundle mainBundle] resourcePath],[soundName UTF8String]]];
    
        AVAudioPlayer *worngAudioPlay = [[AVAudioPlayer alloc] initWithContentsOfURL:urlString error:&error];
    
        if (worngAudioPlay != nil)
        {
            // this will cause the previous one to be released
            [self setPlayer:worngAudioPlay];
            [worngAudioPlay release];
            worngAudioPlay.delegate = self;
            [worngAudioPlay play];
        }
    }
    

    在你的交易中:

    -(void)dealloc {
        [player release];
        [super dealloc];
    }
    

    【讨论】:

    • 我没有 setPlayer 方法。我收到警告
    • 如果你像上面一样在头文件中创建播放器属性,并添加“@synthesize player;”对于您的实现,setHeader 方法是隐式的。
    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多