我有一个TableViewController,它显示用户图像和每行条目的一些文本。此图像加载到“cellForRowAtIndexPath”方法中:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell : ApplicantsCell = tableView.dequeueReusableCellWithIdentifier("Cell") as! ApplicantsCell
{...}
let image = UIImage(named: "avatar")
cell.applicantImage.image = image
if let applImage = applicant.image as PFFile? {
applImage.getDataInBackgroundWithBlock {
(imageData: NSData?, error: NSError?) -> Void in
if error == nil {
let image = UIImage(data: imageData!)
cell.applicantImage.image = image
}
}
}
return cell
}
每当我重新打开应用程序并转到此TableViewController时,Instruments会向我显示,创建了一个新的“ImageIO_jpeg_Data”对象,并且旧的对象永远不会被释放。每个对象需要大约13 MB的内存...所以经过几次迭代后,内存使用量会超过100 MB并继续...: Memory Usage http://twail.net/stack/screen.png。
在模拟器中触发低内存警告不会释放任何内存......
有人可以帮助我解除内存的释放吗?
答案 0 :(得分:1)
你做错了两件事。
首先,在将图像添加到单元格之前,始终将图像缩小到实际的显示尺寸。在内存中保留13 MB的图像只是为了在单元格中显示该图像的微小缩略图版本是错误的。
其次,这段代码毫无意义,会给你带来麻烦:
if error == nil {
let image = UIImage(data: imageData!)
cell.applicantImage.image = image
}
请记住,单元格被重用,所以当这段代码运行时,cell
指向的单元格可能不再存在于界面中,或者可能显示表格的不同行(因为它是重复使用)。而是将(缩小的)图像存储在数据模型中并重新加载表。