0

我正在将一系列图像从服务器加载到 NSData 对象中,如下所示:

for (int i = 0; i < 36; i++)
{
    NSURL *url = [NSURL URLWithString:@"http://12.34.56.78/image.jpg"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    // Further processing here
}

问题是每个数据对象的一半都保存在内存中。这不会显示为仪器泄漏。我知道它是 NSData 对象,因为我已经删除了与图像有关的所有内容,并且现在实际上只有评论前的两行。发生相同的行为。我尝试过分配初始化和显式释放,结果相同。

真正难以弄清楚的是,我创建了第二个项目来尝试重新创建这种行为,但我无法做到这一点。在另一个项目中,此代码按预期运行。所以我问,什么可能导致这种行为?我觉得我忽略了一些非常明显的东西。

4

3 回答 3

0

从您编写的两行来看,该数据对象永远不应该泄漏,因为您没有保留它,当您超出范围时,该数据对象应该自动释放......所以不能从您发布的两行中真正看出..

于 2009-08-18T16:04:09.277 回答
0

我遇到过类似的事情,我的 AppDelegate 中有一个数组,我正在抓取对单行的引用,然后(错误地)释放对象上的句柄。结果是在 3 次后续调用之后,有问题的行中的对象在所有属性中都具有 nil 值,但它本身不是 nil。我花了大约一周的时间才弄清楚这一点。直到今天,我仍然不知道为什么在我发现问题之前需要 3 个电话才能发布。当一周后我意识到一行代码是 20 个小时左右的浪费时间的来源时,我相信你可以想象我的沮丧。;)

于 2009-08-18T16:10:07.063 回答
0

如果您看到内存在稳步增长,请使用 Instruments 的 Object Allocations 探针,并查找实际持有内存的内容。有很多方法以非“泄漏”的方式浪费内存。大小是 NSData 大小的一半这一事实表明您找错了地方。您不太可能释放半个对象。

于 2009-08-18T16:18:46.237 回答