2

我是使用 avadioplayer 的新手,每次播放声音时我似乎都有记忆。我无法弄清楚我在 Instrument 中缺少什么来摆脱它。这可能是误报吗?

视图控制器.h:

@interface ISpectatorViewController : UIViewController <UIAccelerometerDelegate>{

AVAudioPlayer *massCheerSoundID;

}

@property(nonatomic,retain) AVAudioPlayer * massCheerSoundID;

// ViewController.m

- (void)viewDidLoad {

    NSString * filePath;

    filePath = [[NSBundle mainBundle] pathForResource:@"massCheer" ofType:@"mp3"];

    massCheerSoundID = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath ]error:nil];

}

- (void) playSound
{

        if(massCheerSoundID.playing == false)
    {

        massCheerSoundID.currentTime = 0.0;


                //leak here
        [massCheerSoundID play];
    }
}

- (void)dealloc {

    [super dealloc];
    [massCheerSoundID release];

}

我发现了问题所在。

我必须在界面上添加 AVAudioPlayerDelegate 因为我已经设置了 UIAccelerometerDelegate

@interface iSpectatorViewController: UIViewController<AVAudioPlayerDelegate>

并设置

massCheerSoundId.delegate = self
4

5 回答 5

3

尝试将 MediaPlayer.framework 添加到您的项目中,无需更改代码

于 2009-11-25T11:52:06.500 回答
2

今天发现了同样的漏洞。添加 MediaPlayer.framework 似乎可以解决这个问题。

于 2010-01-03T00:24:10.983 回答
1

今天发现了同样的漏洞。添加 MediaPlayer.framework 似乎可以解决这个问题。

这也对我有用。奇怪的。

于 2011-03-03T01:45:21.777 回答
1

会不会是你的dealloc方法?

我认为约定是先release调用[super dealloc].

我一直认为这是为了“首先发布你的东西,然后让你的父类处理它”。

你的dealloc方法应该是:

- (void)dealloc {

    [massCheerSoundID release];
    [super dealloc];

}
于 2009-09-15T21:46:32.930 回答
0

问题可能是如果您不释放您的视图,您会一遍又一遍地重新启动 massCheerSoundId。因此,如果您要添加子视图,则会调用 viewDidLoad 并初始化播放器,那么也许您正在删除子视图并再次添加它,因为您没有释放视图(假设您只有一个副本) dealloc 不会被调用(反正我不这么认为),那么如果你重新添加视图 massCheerSoundId 将被覆盖并泄漏..,另一个问题可能是因为你有 massCheerSoundId 作为属性,你分配它并且生成的设置器也保留它,那么你当它应该只为+1时留下+2引用计数......所以假设我的假设是正确的,我建议像这样编写viewDidLoad

    - (void)viewDidLoad {    
    NSString * filePath;   
     filePath = [[NSBundle mainBundle] pathForResource:@"massCheer" ofType:@"mp3"]; 
    if(massCharSoundId!=nil)
{
       AVAudioPlayer *p= [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURLfileURLWithPath:filePath ]error:nil];}
       massCheerSoundID = p;
     [p release];
}
于 2009-09-15T20:22:49.617 回答