Утечка памяти в Swift 3 URLSession

У меня утечки памяти при сетевых вызовах URLSession.shared в swift 3. Это ошибка или я делаю что-то не так?

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

введите здесь описание изображения


person John    schedule 14.03.2017    source источник


Ответы (1)


Сеанс общего URL-адреса имеет хранилище учетных данных для файлов cookie и других «браузерных» материалов. Поскольку он является общим, это синглтон, который будет жить вечно в вашем приложении. Instruments интерпретирует это как утечку.

Совет: повторите действие несколько раз, прежде чем искать утечки.

Кроме того, вполне вероятно, что ссылка на себя в вашем обратном вызове удерживает ваш контроллер представления, пока ваш запрос все еще находится на рассмотрении. Используйте слабое «я» в начале блока, чтобы разорвать цикл. Но это полностью зависит от вашего дизайна. По крайней мере, в нескольких случаях меня это достало.

Я также хочу сослаться на этот ответ: https://stackoverflow.com/a/35757989/3351794

person Andreas Pardeike    schedule 14.03.2017
comment
Есть ли другой способ для сетевых вызовов, который не приведет к утечке памяти? Потому что я пробовал несколько способов, таких как создание нового URLSession с использованием ephimeral, который согласно это работает. Но пока безуспешно - person John; 14.03.2017
comment
Сетевые вызовы через последний URLSession не приводят к утечке памяти. Так что я не понимаю вашего вопроса. Я использую его в своем собственном приложении без каких-либо проблем. См. ответ эскимосов здесь: forums.developer.apple.com/thread/14785 - person Andreas Pardeike; 14.03.2017
comment
То есть вы имеете в виду, что утечка, обнаруженная приборами, на самом деле утечкой не является? - person John; 15.03.2017
comment
Да. Утечка — это выделение, которое никуда не исчезает. Допустим, у вас есть код, который зацикливается на чем-то, а внутри вы используете синглтон. Первая итерация создаст синглтон, а все остальные итерации будут использовать только его (больше никакого выделения). Поскольку синглтон никогда не выпускается, вы считаете это утечкой? Нет. Утечки будут подсчитываться только в том случае, если вы выполняете операцию неоднократно, а потребление памяти все время увеличивается. Кроме того, взгляните на это обсуждение побочных эффектов UrlSessions: stackoverflow.com/a/35757989/3351794 - person Andreas Pardeike; 15.03.2017
comment
Ну это все проясняет. Спасибо. - person John; 15.03.2017