我在游戏中播放一个带有永久循环的全屏视频(背景)。它运行良好,但是当我更改视图时,我在此代码中发现了使用Instruments(内存泄漏模板)识别的内存泄漏:
urlStr = NSBundle.mainBundle().pathForResource("Video_Socle", ofType: "mov")
let url = NSURL(fileURLWithPath: urlStr!)
player = AVPlayer(URL: url)
NSNotificationCenter.defaultCenter().addObserverForName(AVPlayerItemDidPlayToEndTimeNotification, object: player!.currentItem, queue: nil)
{ notification in
let t1 = CMTimeMake(5, 100);
self.player!.seekToTime(t1)
self.player!.play()
}
videoNode = SKVideoNode(AVPlayer: player!)
videoNode!.anchorPoint = CGPointMake (0,0)
videoNode!.size = CGSize(width: 2048, height: 1536)
videoNode!.zPosition = 0
background.addChild(videoNode!)
if synch == false { video_synchronization()
}
videoNode!.play()
当我使用以下代码更改视图时,我创建了一个小的清理函数:
NSNotificationCenter.defaultCenter().removeObserver(self)
player = nil
videoNode = nil
background.removeAllActions()
background.removeAllChildren()
let transition = SKTransition.revealWithDirection(.Right, duration: 2)
let nextScene = MainView(size: scene!.size)
nextScene.scaleMode = .AspectFill
scene?.view?.presentScene(nextScene, transition: transition)
self.viewController?.dismissViewControllerAnimated(true, completion: nil)
我在AVPlayer和SKVideoNode上发现内存泄漏。有些奇怪的是当我移除零件时泄漏消失了:
NSNotificationCenter.defaultCenter().addObserverForName(AVPlayerItemDidPlayToEndTimeNotification, object: player!.currentItem, queue: nil)
{ notification in
let t1 = CMTimeMake(5, 100);
self.player!.seekToTime(t1)
self.player!.play()
}
这段代码我错过了什么?谢谢!
答案 0 :(得分:0)
当您更改视图时,您需要执行以下操作..
如果您有正在播放视频的视图..您需要将其删除。
view.removeFromSuperView()
答案 1 :(得分:0)
观察者代码中的真正问题,该问题对您的对象有很强的引用。你用过
self.player!.seekToTime(t1)
self.player!.play()
self是一个很强的参考,您应该使用[weak self]。 这样会很好
答案 2 :(得分:0)
我遇到了同样的问题,并通过按照建议删除视图然后将视图设置为 nil 来修复它。还要确保暂停 avplayer 并将其设置为 nil。