3

我有一种方法可以不断从网络加载新的图像数据。每当图像的所有数据都到达时,它就会被转发给这样的委托:

NSImage *img = [[NSImage alloc] initWithData:dataDownloadedFromWeb];
if([[self delegate] respondsToSelector:@selector(imageArrived:)]) {
    [[self delegate] imageArrived:img];
} 
[img release]; 

imageArrived:图像数据中分配给一个NSImageView

- (void)imageArrived:(NSImage *)img
{
    [imageView1 setImage:img];
}

这很好用,每个新的下载周期都会显示和更新图像。我已经使用 Instruments 对我的应用程序进行了分析,以确保没有泄漏 - 它没有显示任何泄漏。但是,如果我检查 Instruments 的活动监视器,我可以看到我的应用程序随着时间的推移占用越来越多的内存,大致随着下载图像的大小而增加。如果我省略[imageView1 setImage:img],内存使用量保持不变。我的问题是:这是怎么回事?我的代码泄露了吗?NSImage内部的实例如何NSImageView确定何时释放其数据?感谢您的回答!

4

1 回答 1

1

当您执行 initWithData 时,数据的保留计数会增加 1。释放图像不会更改数据的保留计数。那就是你的记忆要去的地方。图像结构以您想要的方式来来去去,但数据块正在积累。

单独保存数据句柄并在处理 nsimage 后将其清除,一切都应该很好:

(id) olddata = 0; // global or something with persistence
your_routine
{
    (id) newdata = dataDownloadedFromWeb;
    NSImage *img = [[NSImage alloc] initWithData: newdata];
    if([[self delegate] respondsToSelector:@selector(imageArrived:)])
    {
        [[self delegate] imageArrived:img];
    }
    [img release];
    if (olddata) [olddata release];
    olddata = newdata;
}

cleanup
{
    if (olddata) [olddata release];
    olddata = 0;
}
于 2011-04-13T17:05:51.353 回答