使用NSData时内存使用量增加(contentsOfURL:imageUrl)

时间:2015-12-29 11:58:24

标签: ios xcode swift memory nsdata

我使用NSOperation下载图片。图像用于集合视图中。使用仪器我找不到增加内存使用的原因(我仍然觉得很难理解仪器中的Allocations部分)。我开始评论部分代码以查看问题发生的位置。

NSOperation的定义如下:

for (int i = 1; i <= 12; i++) { 
    Console.WriteLine("Month {0} - Q{1}", i, Math.Ceiling((i <= 3 ? 12 - i + 1 : i - 3) / 3M));
}

函数在返回之前将imageData设置回nil。这样我确保其余的代码不处理结果,因此不会增加内存。结果是一个空的集合视图。

如果我运行上面代码中所述的代码,我可以在滚动集合视图时看到内存增加。但是当我注释掉这行时,没有增加的记忆

class ImageDownloader: NSOperation {
    var url: String
    var imageData: NSData?

    init(url: String) {
        self.url = url
    }

    override func main() {
        if self.cancelled {
            return
        }

        if let imageUrl = NSURL(string: url) {
             // retrieve data from web
             imageData = NSData(contentsOfURL: imageUrl)
        }

        imageData = nil    // This line is added so the rest of the code is not handling the result. This way I am able to pinpoint the source of the increasing memory
        return
    }
}

我希望有人可以解释为什么操作完成后NSData使用的内存(contentsOfURL:imageUrl)没有完全释放? 在滚动时,我可以更改什么以避免增加内存?

1 个答案:

答案 0 :(得分:0)

我认为我发现了问题:我有一个NSOperation的保留周期。完成块引用“self”。因此,不会释放所有创建的操作。内存增加是由操作中的imageData变量引起的。

我还不知道如何解决这个保留周期。我将针对此问题发布另一个问题:Swift: Retain cycle with NSOperation