我已完成项目编码,但是当我在客户端提交源代码时,它已经过测试,然后检测到内存泄漏。我已经在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;
}
以下是我检测上述内容的方法:
希望有人能帮助我,这是我第一次检测到内存泄漏。所以我希望你的指导。非常感谢。
答案 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
中释放它(可能是其他一些实例变量)。希望这会有所帮助。