【问题标题】:iPhone/iPad - help freeing up a little memoryiPhone/iPad - 帮助释放一点内存
【发布时间】:2011-03-18 18:36:51
【问题描述】:

我的记忆有问题,我无法理顺。我正在做的是这样的:

我有一个视图控制器,它看起来类似于具有 7 个不同选项卡的书。每次用户按下选项卡时,“页面”上的内容都会发生变化,背景图像也会发生变化以反映所选的不同选项卡。每个背景图像为 768x1024,7 个选项卡中的每个选项卡都有一个。

我的问题是,选择每个选项卡时,内存永远不会为上一个图像释放,并且选择7个选项卡后,我有类似的30MB被用完为7个不同的图像。对于用户按下的 7 个选项卡中的每一个,我有 7 种不同的方法。

-(IBAction) pressedTab1 {

    self.tabsImageView.image = nil; //tabsImageView is the imageView I am keeping he background image in.
    UIImage *tempUIImage = [UIImage imageNamed:@"tab1selected.png"]; 

    self.tabsImageView.image = tempUIImage;


}

【问题讨论】:

    标签: iphone memory uiimageview


    【解决方案1】:

    您可以像这样直接分配图像。并且因为 [UIImage imageNamed...] 是自动释放的,内存将为您处理。

    -(IBAction) pressedTab1 {
      self.tabsImageView.image = [UIImage imageNamed:@"tab1selected.png"];
    }
    

    【讨论】:

    • 不幸的是,这并没有这样做。每次我选择一个标签时,我的分配仍然会增加大约 4MB。
    • 问题一定是在你的代码中的其他地方——因为那不会泄露。 [UIImage imageNamed...] 非常擅长自动释放内存和缓存图像,如果您多次使用它。
    • 谢谢 - 如果它有帮助,它只会在第一次加载图像时跳起来。打开所有 7 个选项卡后,内存使用量保持不变。
    • 请记住,即使您使用的是 PNG 图像文件,它们也会以位图的形式存储在内存中,因此它们占用的内存要比磁盘上的多。
    • 是的,这是有道理的。我认为这是因为缓存。您可能想要做的是在类本身上定义这些图像并在 init() 上初始化它们。这样,如果您想将它们设置回 nil,您就可以对它们进行全类处理。上面代码的问题是,您每次都在创建一个新图像,并且没有正确处理前一个图像,因此当您将其设置回 nil 时,您实际上并没有释放您认为的图像。跨度>
    【解决方案2】:

    您发布的代码没有泄漏。当您点击所有 7 个选项卡时,您的应用程序将达到 30MB 内存。但是,如果您继续在选项卡之间切换会发生什么?每次开关都继续增加吗?如果是,那么您肯定在其他部分有泄漏。如果不是(即内存或多或少是 30MB 常量),那么这可能根本不是问题。有时系统直到需要内存并且可以接受 30MB 时才会释放东西。它还可以缓存图像数据。在这种情况下,您无需担心。虽然我没有找到说明此功能的 Apple 文档,但我遇到了类似的情况。

    除了您最初的问题之外,有一件事是您确实应该避免使用如此大的图像(768x1024 像素)。这可能会导致巨大的问题,至少在低端设备中是这样。

    【讨论】:

    • 感谢您的输入 - 它是 iPad 设备,因此 768x1024 是我能得到的最小尺寸。我问的原因是因为 didReceiveMemoryWarning 被绊倒了,它导致我其他选项卡中的视图重置。不过你是对的,在打开 7 个选项卡后,内存使用量停止上升。
    • 您可以尝试的另一个选项是,而不是依赖于您自己的自动释放、分配和释放图像。
    • 做到了 - 自己释放就像一个魅力 - 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多