【问题标题】:NSCache, does removeAllObjects release the memory usage? I'm using ARCNSCache,removeAllObjects 会释放内存使用吗?我正在使用 ARC
【发布时间】:2012-07-27 16:20:26
【问题描述】:

我正在使用 ARC 和 NSCache,它们是在我的应用委托中创建并存储的。然后我通过应用程序委托从控制器调用它。 NSCache 在从 url 加载图像时存储图像,并且内存使用量上升得非常快。当我检查分析器的实际内存使用情况时,我的应用程序甚至达到了 320 MB 的内存使用情况,但在分配时它说它刚刚分配了 20-30 MB。

在我的应用委托中,我将缓存设置如下(它是一个 ivar):

cache = [[NSCache alloc] init];
[cache setCountLimit:100];
[cache setTotalCostLimit:1500000];
[cache setEvictsObjectsWithDiscardedContent:YES];

我实现了一个按钮来试验 NSCache,当我点击它时,它会调用:

- (IBAction)eraseCache:(id)sender {
    [[appDelegate cache] removeAllObjects];
}

在分析器上,使用的内存并没有下降,但它实际上又开始重新获取图像,所以我知道删除了哪些对象。如何使用 ARC 随意释放此内存使用量?如何获取缓存的大小以知道何时释放它?

【问题讨论】:

    标签: objective-c memory-management nscache


    【解决方案1】:

    在 ARC 中,一旦没有指向对象的指针,它就会自动释放。如果您拥有的唯一指向该对象的指针在缓存中,那么它们已被释放。

    请注意,您实际上不必删除对象;如果您将指针分配给一个新对象(结果它不再指向旧对象),那么旧对象将被释放。

    Ex:
    NSArray *array = [NSArray new];
    array = [NSArray new]; //the original array gets deallocated because nothing points to it.
    

    来自 NSCache 类参考:

    NSCache 类包含各种自动删除策略,其中 确保它不会使用过多的系统内存。这 如果内存需要,系统会自动执行这些策略 其他应用。调用时,这些策略会删除一些项目 从缓存中提取,最大限度地减少其内存占用。

    【讨论】:

    • 那么,为什么当我按下“removeAllObjects”按钮时内存使用量没有下降?会发生什么?
    • 它可能只保留在内存中,直到操作系统决定再次需要该内存。你的应用崩溃了吗?
    • 您对图片还有其他参考吗?请注意,如果将它们放入视图中,这将被视为强参考。还要确保您的内容设置为可丢弃。
    • 是的,它们在 UIImageView 中,并且显示在 ViewController 上。你建议做什么?顺便问一下,“设置为可丢弃”是什么意思。
    • 读取 NSCache 类引用,可以告诉它是否丢弃图像。如果您要显示大量图像,请在需要释放内存时从视图控制器中删除图像视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多