Objective c NSImage';什么是数据保留行为?

Objective c NSImage';什么是数据保留行为?,objective-c,cocoa,nsimage,nsimageview,Objective C,Cocoa,Nsimage,Nsimageview,我有一种方法,可以不断从网络上加载新的图像数据。每当图像的所有数据到达时,都会将其转发给代理,如下所示: NSImage *img = [[NSImage alloc] initWithData:dataDownloadedFromWeb]; if([[self delegate] respondsToSelector:@selector(imageArrived:)]) { [[self delegate] imageArrived:img]; } [img release];

我有一种方法,可以不断从网络上加载新的图像数据。每当图像的所有数据到达时,都会将其转发给代理,如下所示:

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
实例如何确定何时释放其数据?谢谢你的回答

执行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;
}

你确定是图像侵蚀了你的记忆吗。如果没有发生泄漏,可能旧数据被保存在其他地方,但仍被引用,因此不会导致“泄漏”。NSImageView上的图像当然具有正常的保留/释放特性。请尝试将
NSImage
的缓存模式设置为
NSImageCacheNever
;但是,当您替换对象时,缓存应该随对象一起释放。谢谢,这确实发生了:下载的数据被额外存储到一个内部数组中,而没有释放它。我的道歉。我可以删除我不必要的问题吗?:)您可以对其进行标记,并要求审核人删除它。