2

我已经完成了我的项目的编码,但是当我在客户端提交我的源代码时,它已经过测试,然后检测到内存泄漏。我已经在Instruments using Leaks. 我遇到的问题是在我的AVPlayer和我的AVAudioPlayer以及我的AppDelegate. 我应该为此找到替代品吗?还是我的代码有问题?

下面是我的代码(ARC顺便说一下我正在使用):

---> AppDelegate

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([RootViewAppDelegate class]));
    }
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{  
[window makeKeyAndVisible];

---> AVPlayer

self.moviePlayer = [AVPlayer playerWithURL:[NSURL fileURLWithPath:moviePath]];

---> AVAudioPlayer

NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
resourcePath = [resourcePath stringByAppendingString:@"/Normal.wav"];
NSLog(@"Path to play: %@", resourcePath);
NSError* err;

//Initialize our player pointing to the path to our resource
BGMplayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:resourcePath] error:&err];

if( err ){
    //bail!
    NSLog(@"Failed with reason: %@", [err localizedDescription]);
}
else{
    //set our delegate and begin playback
    BGMplayer.delegate = self;
    [BGMplayer play];
    BGMplayer.numberOfLoops = -1;
    BGMplayer.currentTime = 0;
    BGMplayer.volume = 1.0;
} 

以下是我检测上述内容的方法:

在此处输入图像描述


希望有人能帮助我,这是我第一次检测内存泄漏。所以希望得到您的指导。非常感谢您。

4

3 回答 3

0

我的猜测是

//set our delegate and begin playback
BGMplayer.delegate = self;

AVPlayer 保留您的视图,并且由于您的视图还保留了 AVPlayer,因此您有一个保留圈,可以防止两者都被弧线释放。

我建议在不再需要委托时将其设置为 nil ......也许通过removeFromSuperview在您的视图中覆盖。

将以下内容添加到您的视图中:

- (void)removeFromSuperview {
    BGMplayer.delegate = nil;
    [super removeFromSuperview];
}
于 2012-09-25T12:19:54.707 回答
0

首先,您应该通过 shift+Command+B 组合键来分析您的代码,希望它能告诉您内存泄漏。

于 2012-09-25T10:54:11.253 回答
-1

似乎您的某些实例变量没有被释放。我认为,您的moviePlayer财产保留了该AVPlayer对象,而您没有将其释放dealloc(可能是其他一些实例变量)。希望这可以帮助。

于 2012-09-25T11:15:45.267 回答