我有一种不断从网络加载新图像数据的方法。每当图像的所有数据都到达时,它就会被转发给这样的代表:
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的Activity Monitor,我可以看到我的应用程序随着时间的推移而占用越来越多的内存,大致增加了下载图像的大小。如果省略[imageView1 setImage:img]
,则内存使用量保持不变。我的问题是:这是怎么回事?我的代码泄露了吗? NSImage
中的NSImageView
实例如何确定何时发布其数据?谢谢你的回答!
答案 0 :(得分: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;
}