检测/修复内存泄漏

时间:2012-09-25 10:35:10

标签: iphone objective-c ios xcode

我已完成项目编码,但是当我在客户端提交源代码时,它已经过测试,然后检测到内存泄漏。我已经在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;
} 

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

enter image description here


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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我的猜测是

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

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

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

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

- (void)removeFromSuperview {
    BGMplayer.delegate = nil;
    [super removeFromSuperview];
}

答案 2 :(得分:-1)

好像有些实例变量没有被释放。我认为,您的moviePlayer属性保留了AVPlayer对象,并且您没有在dealloc中释放它(可能是其他一些实例变量)。希望这会有所帮助。