2016-07-11 14 views
0

Ich bin eine schnelle NSTimer (alle 0,15s), und ich sehe, dass etwa alle 10 Sekunden die Speichererhöhung von etwa 0,5 MB.Swift: NSTimer Speicherleck

Hier ist mein Code:

dispatch_async(dispatch_get_main_queue(),{ 
     //Prepare timer handshake 
     if let tmr = self.tmrHandshake { 
      tmr.invalidate() 
      self.tmrHandshake = nil 
     } 
     self.tmrHandshake = NSTimer.scheduledTimerWithTimeInterval(0.15, target: self, selector: #selector(self.sendLifeBeat), userInfo: nil, repeats: true) 
     NSRunLoop.mainRunLoop().addTimer(self.tmrHandshake!, forMode: NSRunLoopCommonModes) 
    }) 

Und die Auswahlmethode:

dynamic private func sendLifeBeat() { 
    let dataBytes = NSMutableData(data: lifebeatCmd.dataUsingEncoding(NSUTF8StringEncoding)!) 
    dataBytes.appendData(terminator.dataUsingEncoding(NSUTF8StringEncoding)!) 

    socketClient!.writeData(dataBytes, withTimeout: 5, tag: 1) 
} 

Diese "dispatch_async" innerhalb einer Methode aufgerufen wird, die auf einem Hintergrund-Thread ausgeführt wird.

Haben Sie Vorschläge, wie Sie dieses Problem lösen können? Danke.

+0

Mögliche Duplikat von [NSTimers verursachen Lecks] (http://stackoverflow.com/questions/5172711/nstimers- verursacht-Lecks) –

+0

@CodeDifferent schwer zu 'retain()' in Swift-Code. –

Antwort

0

Profilieren Sie Ihre App mit Instrumenten, wählen Sie die Vorlage "Leaks", aktivieren Sie "Ereignisse für freigegebenen Speicher verwerfen" und "NSZombie-Erkennung aktivieren". Untersuchen Sie die Objekte, die nicht freigegeben werden.

Wenn Sie XCode 8 verwenden, sollten Sie Speicherlecks im "Issue Navigator" unter "Runtime" sehen.

Dies ist, was ich tun würde, wenn ich ein Leck finden würde. Versuchen Sie es selbst zu debuggen, ich kann in Ihrem Beispiel keinen schlechten Code sehen.

1

Machen Sie sich selbst ein schwaches oder unowned Referenz in der Verschluss - Sie eine Referenzschleife haben, und es ist das Aufheben von Zuweisungen nicht