2017-03-14 2 views
1

J'ai des fuites de mémoire dans mes appels réseau pour URLSession.shared dans swift 3. Est-ce un bug ou je fais quelque chose de mal?fuite de mémoire Swift 3 URLSession

override func viewDidLoad() { 
    super.viewDidLoad() 
    let urlStr = "https://qrng.anu.edu.au/API/jsonI.php?length=10&type=hex16&size=2" 
    URLSession.shared.dataTask(with: URL(string: urlStr)!) { data, response, error in 
     self.view.backgroundColor = UIColor.red 
     print(response) 
    }.resume() 
} 

enter image description here

Répondre

0

séance URL partagée a un stockage des identifiants pour les cookies et autres trucs "du navigateur". Comme il est partagé c'est un singleton qui vivra pour toujours dans votre application. Instruments interprète cela comme une fuite. Conseil: répéter l'action plusieurs fois avant de rechercher des fuites.

De même, il est fort probable que l'auto-référence dans votre rappel reste sur votre contrôleur de vue alors que votre demande est toujours en attente. Utilisez le soi faible au début du bloc pour rompre le cycle. Mais cela dépend totalement de votre conception. Il m'a eu au moins dans quelques cas.

Je veux aussi faire référence à cette réponse: https://stackoverflow.com/a/35757989/3351794

+0

est-il un autre moyen pour les appels réseau qui causent l'habitude une fuite de mémoire? Parce que j'ai essayé plusieurs façons de créer une nouvelle 'URLSession', en utilisant' ephimeral' qui, selon [this] (http://footle.org/2015/10/10/fixing-a-swift-memory -leak /) fonctionne. Mais jusqu'à présent, sans succès – John

+0

Les appels réseau via la dernière URLSession ne fuient pas la mémoire. Donc, je ne comprends pas votre question. Je l'utilise dans ma propre application sans aucun problème. S'il vous plaît voir les réponses eskimos ici: https://forums.developer.apple.com/thread/14785 –

+0

Donc vous voulez dire que la «fuite» détectée par les instruments n'est pas réellement une fuite? – John