2016-07-11 1 views
0

Je cours un rapide NSTimer (tous les 0.15s), et je vois que toutes les 10 secondes environ l'augmentation de la mémoire d'environ 0.5mb.Swift: fuite de mémoire NSTimer

Voici mon 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) 
    }) 

Et la méthode de sélection:

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

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

Ces "dispatch_async" est appelée dans une méthode qui est en cours d'exécution sur un thread d'arrière-plan.

Avez-vous une suggestion sur la façon de résoudre ce problème? Merci.

+0

double possible de [NSTimers provoquant des fuites] (http://stackoverflow.com/questions/5172711/nstimers- provoquant des fuites) –

+0

@CodeDifferent Difficile d'appeler 'retain()' dans le code Swift. –

Répondre

0

Profilez votre application à l'aide d'Instruments, choisissez le modèle "Fuites", cochez "Supprimer les événements pour libérer la mémoire" et "Activer la détection NSZombie". Inspectez les objets qui ne sont pas libérés.

Si vous utilisez XCode 8, vous devriez voir des fuites de mémoire dans le "Navigateur de questions" sous "Runtime".

C'est ce que je ferais quand je trouverais une fuite. Essayez de le déboguer vous-même, je ne vois pas de mauvais code dans votre exemple.

1

Faire soi une référence faible ou unowned la fermeture - vous avez une boucle de référence et il ne désaffecter