iPhone/iPad-帮助释放一点内存

iPhone/iPad-帮助释放一点内存,iphone,memory,uiimageview,Iphone,Memory,Uiimageview,我的记忆力有问题,我无法纠正。我现在做的是: 我有一个viewcontroller,它看起来像一本有7个不同选项卡的书。每次用户按下选项卡时,“页面”上的内容都会发生变化,背景图像也会发生变化,以反映所选的不同选项卡。每个背景图像为768x1024,7个选项卡各有一个 我的问题是,当选择每个选项卡时,上一个图像的内存永远不会被释放,在选择7个选项卡后,7个不同的图像的内存将消耗大约30MB。对于用户按下的7个选项卡,我有7种不同的方法 -(IBAction) pressedTab1 {

我的记忆力有问题,我无法纠正。我现在做的是:

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

我的问题是,当选择每个选项卡时,上一个图像的内存永远不会被释放,在选择7个选项卡后,7个不同的图像的内存将消耗大约30MB。对于用户按下的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;


}

您可以像这样直接指定图像。由于[UIImage ImageName…]是自动释放的,内存将为您处理

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

你发布的代码没有泄漏。当你点击所有7个标签时,你的应用程序的内存就达到了30MB。但是,如果继续在选项卡之间切换,会发生什么情况?是否在每个开关中都会继续增加?如果是的话,那么你肯定在其他部分有泄漏。如果不是(即内存大小为30MB常量),则这可能根本不是问题。有时,系统在需要内存且30MB是可以接受的情况下才会释放内存。它还可以缓存图像数据。在这种情况下你不必担心。虽然我没有发现苹果的文档说明这个特性,但我也遇到过类似的情况


除了你最初的问题,有一件事是你应该真正避免这样大的图像(768x1024像素)。这可能会造成巨大的问题,至少在低端设备中是如此

不幸的是,这并没有做到。每次我选择一个选项卡时,我的分配仍然会增加大约4MB。这个问题一定是在代码中的其他地方,因为这不会泄漏。[UIImage ImageName…]在自动释放内存和缓存图像(如果您多次使用图像)方面也非常出色。谢谢-如果有帮助,它只会在第一次加载图像时跳起来。打开所有7个选项卡后,内存使用情况保持不变。请记住,即使您使用的是PNG图像文件,它们也以位图的形式存储在内存中,因此它们将占用比磁盘上多得多的内存。是的,这很有意义。我认为这是因为缓存。您可能需要在类本身上定义这些映像,并在init()上初始化它们。这样,如果您想将它们设置回nil,就有一个类范围的句柄。上面代码的问题是,您每次都在创建一个新图像,而没有对上一个图像保持正确的句柄,因此当您将其设置为零时,您实际上并没有释放您认为是的图像。感谢您的输入-这是一个iPad设备,因此768x1024是我能得到的最小的图像。我问这个问题的原因是因为didReceiveMemoryWarning被绊倒了,导致我的其他选项卡中的视图重置。但是你是对的,在7个标签被打开后,内存使用停止上升。你可以尝试的另一个选择是,而不是依靠自动释放、alloc和自己释放图像。这样做了-自己做释放工作很有魅力-谢谢!