2011-04-05 58 views
3

我有一种方法,不断从网络加载新的图像数据。每当一个图像的所有数据已经​​来临,它被转发到一个委托像这样:NSImage的数据保留行为如何工作?

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的活动监视器,我可以看到我的应用程序随着时间的推移抓取了越来越多的内存,大大增加了下载图像的大小。如果我省略[imageView1 setImage:img],内存使用情况保持不变。我的问题是:这是怎么发生的?我的代码是否泄漏? NSImageView中的NSImage实例如何确定何时释放其数据?谢谢你的回答!

+2

你确定它是吃你的存储器中的影像。如果没有泄漏发生,也许旧数据被保存在其他地方,但仍被引用,因此不会导致“泄漏”。 NSImageView上的图像肯定具有正常的保留/释放特性。 – vickirk 2011-04-05 09:50:28

+1

尝试将'NSImage'的缓存模式设置为'NSImageCacheNever';但是在替换时缓存应该与对象一起释放。 – 2011-04-05 10:11:33

+0

谢谢,这确实是发生了什么事:下载的数据被另外存储到内部数组中而不释放它。我的道歉。我可以以某种方式删除我不必要的问题吗:) – carsten 2011-04-05 11:15:06

回答

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; 
} 
相关问题