我使用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)没有完全释放? 在滚动时,我可以更改什么以避免增加内存?
答案 0 :(得分:0)
我认为我发现了问题:我有一个NSOperation的保留周期。完成块引用“self”。因此,不会释放所有创建的操作。内存增加是由操作中的imageData变量引起的。
我还不知道如何解决这个保留周期。我将针对此问题发布另一个问题:Swift: Retain cycle with NSOperation