objective-c - NSImage 的数据保留行为是如何工作的?

标签 objective-c cocoa nsimage nsimageview

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

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],内存使用量将保持不变。我的问题是:这是怎么回事?我的代码泄漏了吗? NSImageView 中的 NSImage 实例如何确定何时释放其数据?感谢您的回答!

最佳答案

当您执行 initWithData 时,数据 的保留计数会递增 1。释放图像不会改变数据的保留计数。那就是你的内存要去的地方。图像结构按照您想要的方式来来去去,但数据 block 正在积累。

单独保存数据句柄并在处理 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;
}

关于objective-c - NSImage 的数据保留行为是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5549960/

相关文章:

ios - 如何删除 iOS 组件中的边框

iphone - 如何在 iOS 中获取应用内购买的区域设置货币价格?

iphone - 如何使用 ios 6.0 中的社交框架从 iphone 应用程序在 facebook 上共享图像?

swift - 使用 Swift 向 NSImage 添加模糊

swift - 在扩展函数中处理零计数 - 用于 image.results 中的结果

objective-c - 核心数据 + NSTextView + 撤消管理器

ios - 如何将局部变量更改为实例变量?

cocoa - 从一个 TableView 移动到另一个 TableView

cocoa - 更改包制造商创建的包的图标

macos - MAC OS Xcode Swift 2.2 将 NSImage 转换为 CIImage