AVAudioPlayer不使用ARC释放内存

时间:2013-07-12 21:58:16

标签: iphone ios

我创建了一个包含AVAudioPlayer对象的单例

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>

@interface drwAudioPlayer : NSObject <AVAudioPlayerDelegate>

@property AVAudioPlayer *aPlayer;

+(drwAudioPlayer *) sharedPlayer {

    static drwAudioPlayer *sharedPlayer = nil;
    if (!sharedPlayer) {
        sharedPlayer = [[super allocWithZone:nil] init];
    }
    return sharedPlayer;
}

-(void) setPlayerEpisode:(NSData *) episodeFile {
    NSError *error;
    aPlayer = nil;
    aPlayer = [[AVAudioPlayer alloc] initWithData:episodeFile error:&error];
}

在我的主视图中,我包含了上面的类,并创建了一个drwAudioPlayer类型的对象。当我调用[drwAudioPlayer.aPlayer setPlayerEpisode:foo]时,我看到新文件正在加载并且旧文件被释放。

但是一旦我开始播放文件然后尝试调用[drwAudioPlayer.aPlayer setPlayerEpisode:foo2],内存就会增加所加载新文件的大小。

在加载要播放的新文件之前,我必须做什么才能基本上释放内存。

我正在使用ARC。

2 个答案:

答案 0 :(得分:0)

似乎iOS6和模拟器都存在问题。到目前为止,我只在模拟器中测试了我的应用程序泄漏内存,而不是在实际设备上。当在iPhone上运行代码时,一切都像魅力一样,我的代码中没有泄漏内存。

我还在stackoverflow上发现了这些帖子,它们说的是同样的事情:

Memory Leak AVAudioPlayer

Memory Leak iOS6

答案 1 :(得分:-2)

根据定义,单例是内存泄漏。不要使用它们。相反,在代码中对音频播放器进行引用,当使用播放器的视图控制器消失时,播放器将被取消分配。在iOS下,内存不是垃圾收集,你根本无法做到这样的事情并期望内存被释放,ARC不是垃圾收集器。