因此,我正在进行网络呼叫以检索图像,并使用它来显示一种视频。 一段时间后,我可以看到内存丢失和能量影响: 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()
}
}
用于摘要协议
答案 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
以便您退出递归循环吗?