iOS-由于内存问题错误而终止

时间:2018-11-14 11:51:55

标签: ios swift caching nsurlsession digest

因此,我正在进行网络呼叫以检索图像,并使用它来显示一种视频。 一段时间后,我可以看到内存丢失和能量影响: here

一段时间后,我的应用程序崩溃了,我得到:“由于内存问题而终止”

在此之前,我从图片调用者方法中得到了该错误:“来自dataResponse的错误:该操作无法完成。设备上没有剩余空间”

这是我使用的两种方法:

class BlahForm(ModelForm):
    class Meta:
        model = Blah
        fields = ['blah']

值得一提的是这一行:

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

用于摘要协议

2 个答案:

答案 0 :(得分:1)

似乎您在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()
    }
}

如果您想了解更多有关

答案 1 :(得分:0)

好像您递归地调用imageThumbnailcall。如果您没有在某个时候结束递归,则可以准确地看到所报告的症状。

   if self.isInVC {
        self.imageThumbnailcall()
   }

您确定要正确设置isInVC以便您退出递归循环吗?