【问题标题】:UIImage ImageNamed methodUIImage ImageNamed 方法
【发布时间】:2011-01-30 19:20:15
【问题描述】:

在我的应用程序中,我将几个图像加载到 UIScrollView 上,并使用 Core Graphics 例程突出显示滚动视图的一部分。我在例程期间使用了 CGImageRelease 和 CGContextRelease 来管理内存。

当我使用工具(分配)运行应用程序时,我发现每次滑动滚动视图时内存消耗都会不断增加。这在某一时刻会导致应用变得非常缓慢。

为了加载不同的图像,我使用 UIImage ImageNamed 方法,我遇到一些帖子表明这不是一个好主意,因为该方法会导致自动释放图像,从而产生内存问题。我想知道我是否正在寻找错误的正确位置。什么地方可以查找这种异常的内存消耗?

另外,使用 Instruments 的分配,我可以看到内存的增加,是否可以指出这些分配发生的代码?

提前感谢您的帮助!

最好的 DKV

【问题讨论】:

    标签: uiscrollview uiimage core-graphics instruments imagenamed


    【解决方案1】:

    为了加载不同的图像,我使用 UIImage ImageNamed 方法,我遇到过一些帖子表明这不是一个好主意,因为该方法会导致自动释放的图像产生内存问题。

    不,这不是问题。任何不涉及您致电allocinit[WithSomethingOrOther:] 和release 的内容都会自动发布图像。

    问题是imageNamed: 在将图像交给您后继续拥有该图像。您从imageNamed: 获得的每个图像都保留在该缓存中,并与该名称永久关联。这不仅仅是一种“加载这张图片”的方法。这是一种“加载这张图片并让它永远活着*”的方法。

    *“永远”的意思是“直到我的过程结束”。

    我想知道我是否正在寻找错误的正确位置。什么地方可以查找这种异常的内存消耗?

    在仪器中。它会准确地告诉您正在创建的每种对象的数量,以及每种类型的总内存对象占用了多少内存,您可以对该列表进行排序以确定正在消耗内存的内容。然后,您可以深入到每个类和每个对象,以确定在您需要对象后是什么使它们保持活动状态。

    【讨论】:

    • 请问你怎么知道“这是一种‘让它永远活着’的方法”?我可以获得官方参考或声明吗?
    • @JimWatson: The documentation 在细节上含糊其辞,但确实表示它将图像保存在缓存中。更具体的是观察到的行为,可能会发生变化——事实上,这可能在近四年的时间里已经发生了变化:他们可能已经在记忆压力下实施了驱逐。但是,如果没有记录,我不会依赖它。
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多