iOS - завершено из-за ошибки памяти - PullRequest
0 голосов
/ 14 ноября 2018

Итак, я делаю сетевые звонки, чтобы получить изображение, и с его помощью я показываю своего рода видео.Через некоторое время я вижу потерю памяти и влияние энергии: enter image description here

Через некоторое время мое приложение сломалось, и я получил: «Завершено из-за ошибки памяти»

До этого я получил эту ошибку из метода вызывающего изображения: «ошибка из dataResponse: Операция не может быть завершена. На устройстве не осталось места»

Это два метода, которые я использую:

class InstallationViewController: BaseViewController {

    func imageCaller(url: String , success: @escaping (UIImage) -> Void, failure: @escaping () -> Void) {
    let handler = AuthenticateHandler()
    self.urlSession = URLSession(configuration: URLSessionConfiguration.default, delegate: handler, delegateQueue: OperationQueue.main)

    self.imageThumbnailTask = urlSession?.dataTask(with: URL(string:url)!) { data, res, err in

        if err != nil {
            print("error from dataResponse:\(err?.localizedDescription ?? "Response Error")")
            failure()
            return
        }
        DispatchQueue.main.async {

            if let imageData = data, let image = UIImage(data: imageData) {
                success(image)
                URLCache.shared.removeAllCachedResponses()

            }
        }
    }
    self.imageThumbnailTask?.resume()
}

 func imageThumbnailcall() {
    self.indicaotrTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.HandleOverTime), userInfo: nil, repeats: false)

    self.imageCaller( url: self.isShowingThermal ? self.thermalUrl : self.visualUrl, success: { (image) in

        self.indicaotrTimer?.invalidate()

        DispatchQueue.main.async{
            self.imageLoaderIndicator.stopAnimating()
            self.backGroundImageView.image = image
        }
        if self.isInVC {
            self.imageThumbnailcall()
        }
    }) {
        self.imageLoaderIndicator.stopAnimating()
    }
}

Стоит отметить, что эта строка:

   let handler = AuthenticateHandler()
    self.urlSession = URLSession(configuration: URLSessionConfiguration.default, delegate: handler, delegateQueue: OperationQueue.main)

для протокола дайджеста

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Похоже, у вас есть цикл сохранения в вашем закрытии в функции imageThumbnailcall.Закрытие создает сильную ссылку на self, и, поскольку это рекурсивная функция, вам очень быстро не хватит памяти.Вам нужно захватить себя как [weak self] или [unowned self] в закрытии.Пример использования [unowned self]:

func imageThumbnailcall() {
    self.indicaotrTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.HandleOverTime), userInfo: nil, repeats: false)

    self.imageCaller( url: self.isShowingThermal ? self.thermalUrl : self.visualUrl, success: { [unowned self] (image) in

    self.indicaotrTimer?.invalidate()

    DispatchQueue.main.async{
        self.imageLoaderIndicator.stopAnimating()
        self.backGroundImageView.image = image
    }
    if self.isInVC {
        self.imageThumbnailcall()
    }
    }) {
        self.imageLoaderIndicator.stopAnimating()
    }
}

Если вы хотите узнать больше о

0 голосов
/ 14 ноября 2018

Похоже, вы рекурсивно звоните imageThumbnailcall.Если вы не завершите рекурсию в какой-то момент, вы можете увидеть именно те симптомы, о которых вы сообщаете.

   if self.isInVC {
        self.imageThumbnailcall()
   }

Убедитесь, что вы правильно установили isInVC, чтобы выйти из рекурсивного цикла

...