大量内存消耗:ImageIO_jpeg_Data

时间:2015-07-30 14:45:07

标签: ios swift memory parse-platform memory-leaks

我有一个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

在模拟器中触发低内存警告不会释放任何内存......

有人可以帮助我解除内存的释放吗?

1 个答案:

答案 0 :(得分:1)

你做错了两件事。

首先,在将图像添加到单元格之前,始终将图像缩小到实际的显示尺寸。在内存中保留13 MB的图像只是为了在单元格中显示该图像的微小缩略图版本是错误的。

其次,这段代码毫无意义,会给你带来麻烦:

        if error == nil {
            let image = UIImage(data: imageData!)
            cell.applicantImage.image = image
        }

请记住,单元格被重用,所以当这段代码运行时,cell指向的单元格可能不再存在于界面中,或者可能显示表格的不同行(因为它是重复使用)。而是将(缩小的)图像存储在数据模型中并重新加载表。