2016-08-09 74 views
0

Ich spiele ein Vollbild-Video mit einer ewigen Schleife in meinem Spiel (für den Hintergrund). Es funktioniert gut, aber wenn ich die Ansicht zu ändern, erhalte ich Speicherlecks mit Instrumenten identifiziert, auf diesem Code (Memory Vorlage Lecks):Swift iOS: Memory leckt mit dem folgenden Code (Video-Player)

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() 

ich geschaffen habe eine kleine Reinigungsfunktion aufgerufen, wenn ich meine Ansicht ändern mit dem folgenden Code :

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) 

ich Speicherlecks auf der AVPlayer und SKVideoNode identifiziert. Etwas seltsam ist die Lecks verschwinden, wenn ich das Teil zu entfernen:

NSNotificationCenter.defaultCenter().addObserverForName(AVPlayerItemDidPlayToEndTimeNotification, object: player!.currentItem, queue: nil) 
{ notification in 
    let t1 = CMTimeMake(5, 100); 
    self.player!.seekToTime(t1) 
    self.player!.play() 
} 

Was soll ich mit diesem Code fehlt? Vielen Dank !

Antwort

0

wenn Sie die Ansicht ändern Sie die folgenden ..

Wenn Sie irgendeine Ansicht tun müssen, auf dem Sie Video-Wiedergabe sind .. Sie müssen es entfernen.

view.removeFromSuperView()

+0

Danke, wusste ich, dass es nicht. Ich habe deine Zeile kurz vor dem Bildschirmübergang hinzugefügt, in meiner Reinigungsfunktion bekomme ich aber einen schwarzen Bildschirm. Wo sollte gesetzt werden: view.removeFromSuperView() – PGibouin

+0

nächste Mal, sobald Sie zurück auf den gleichen Bildschirm müssen Sie addsubView() gleich. Kurz gesagt, Sie müssen playerView in viewWillAppear() -Methode hinzufügen. remove from superview sollte viewWillDisappear() anzeigen. – JAck

+0

Ich erhalte Speicherlecks, ohne die Ansichten zu ändern, wenn ich versuche, einen SKVideoNode auf die gleiche Weise zu wiederholen, wie Sie es sind. –