将图像设置为按钮 - >占用大量内存?那我该怎么办

时间:2010-08-31 09:52:58

标签: iphone

基本上我用仪器运行我的应用程序并发现只需将背景图像设置为UIButton,就会占用6mb的数据(我不想要低内存警告)。我四处阅读并发现,由于按钮已经分配了图像,它会保留它(和内存)。

我应该如何编码呢?​​我目前的代码如下。顺便说一句,我是iPhone开发的新手,所以请告诉我该怎么做。

顺便说一下这个按钮会把我带到另一个视图。无论如何都要释放分配给这个图像的内存?

.m文件

 -(void)viewDidLoad{
UIColor *background = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"MainScreen.png"]];
selectionScreen.backgroundColor = background;
[background release]
}

3 个答案:

答案 0 :(得分:1)

Wheb viewWillDisappear,您可以将backgroundColor设置为另一种颜色,并释放您制作的背景颜色。

-(void)viewWillDisappear:(BOOL)animated
{
  // release original backgroundColor
  // default backgroundColor is nil by UIView class reference.
  selectionScreen.backgroundColor = nil;     

}

希望这可以帮到你。

答案 1 :(得分:1)

您在上面的评论中提到您的.png低于300k。这可能是一个很大的触摸,但你实际上并没有看到正确的事情。 png扩展为本机CGImage对象。我通常想象一个32位图像,alpha占用width * height * 4字节的内存。这几乎可以保证比它扩展的PNG更大,在你的情况下确实可能非常大。足以让文档建议不要实例化大于1024 x 1024的UIImages。

现在,一个解决方案可能是-initWithPatternImage可以拍摄一小部分背景,并在绘制时将其平铺。所以你解决这个问题的第一步就是尽可能地提供一个小图像的方法,并让它平铺到更大的尺寸。

第二件事,保留。在背景上设置后,您正确地释放了UIColor对象。你想要设置它的对象以保留它!在一个无限记忆的世界中,你希望该按钮保持其背景颜色,直到它所在的视图控制器被取消分配。如果它仍然很大并且你必须在退出视图控制器之前摆脱它(比如当你推送到新的UINavigationController视图或其他东西时),你可以尝试将背景设置为nil(或者可能是系统默认颜色) -viewDidDisappear并在-viewWillAppear重新构建您的背景。

答案 2 :(得分:0)

你尝试过使用过这样的东西:
button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setFrame:/frameOfChoice/];
[button setBackgroundImage:[UIImage imageNamed:@"MainScreen.png"] forControlState:UIControlStateNormal];

我不确定这会如何影响内存使用量。