Swift iOS:内存泄漏,代码如下(视频播放器)

时间:2016-08-09 11:48:46

标签: ios swift memory memory-leaks

我在游戏中播放一个带有永久循环的全屏视频(背景)。它运行良好,但是当我更改视图时,我在此代码中发现了使用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()
}

这段代码我错过了什么?谢谢!

3 个答案:

答案 0 :(得分:0)

当您更改视图时,您需要执行以下操作..

如果您有正在播放视频的视图..您需要将其删除。

view.removeFromSuperView()

答案 1 :(得分:0)

观察者代码中的真正问题,该问题对您的对象有很强的引用。你用过

self.player!.seekToTime(t1)
self.player!.play()

self是一个很强的参考,您应该使用[weak self]。 这样会很好

答案 2 :(得分:0)

我遇到了同样的问题,并通过按照建议删除视图然后将视图设置为 nil 来修复它。还要确保暂停 avplayer 并将其设置为 nil。