2011-08-01 57 views
0

我在处理内存管理时遇到了一些问题。我使用循环将图像和按钮添加到主视图。图像正确释放,但不是按钮。使用UIButton进行内存管理

我的问题归结为,给出以下代码,为什么当我按下按钮来清除屏幕,内存不释放? UIButton是从UIButtonType自定义的autoreleased,并且setImage autoreleases交通图。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIButton *homeButton = [UIButton buttonWithType:UIButtonTypeCustom]; 

    [homeButton setFrame:[UIScreen mainScreen].bounds]; 
    [homeButton setBackgroundColor:[UIColor blueColor]]; 
    [homeButton setImage:[UIImage imageNamed:@"TransportationMap.png"] forState:UIControlStateNormal]; 
    homeButton.tag = 9399; 
    [homeButton addTarget:self action:@selector(clearScreen) forControlEvents:UIControlEventTouchUpInside]; 

    [self.view addSubview:homeButton]; 
} 

-(void)clearScreen 
{  
    for (UIView *view in [self.view subviews]) { 
     [view removeFromSuperview]; 
    } 
} 
+0

你是什么意思的“图像正确释放,但不是按钮”? – highlycaffeinated

+0

这是参考我的实际程序,我添加图像和文本,以及按钮。我没有正确释放图像的问题,只有按钮。这只是代码示例,我用自定义图像实现了一个按钮,并且在将按钮从屏幕上移除后内存泄漏 – Dylan

回答

1

它看起来像我没有在这些代码中分配任何内存,所以你也不需要释放任何东西。

+0

当按钮在屏幕上时,内存被分配给按钮的图像“TransportationMap”。当我使用clearScreen方法清除按钮时,该内存仍在使用中。根据文书。 – Dylan

+0

不幸的是,仪器无法通过,尤其是自动释放物品。然而,假设它在某种程度上是正确的,考虑在创建按钮之前创建一个新的NSAutoreleasePool,然后你可以在最后调用-drain来强制按钮的dealloc。 – iandotkelly

1

你放置的地方你不需要放置它们......苹果的内存管理规则规定你拥有的任何东西(任何你放弃或复制或保留的东西),你负责释放。除此之外,你通常不应该关心发生了什么。苹果公司可能为了自己的目的而缓存图片等等,这是操作系统的责任,而不是你的。在你的代码中,你遵守所有的规则(据我所知)......你没有分配或保留按钮或图像。因此,你不应该担心释放或释放内存。让框架处理它。

+0

有趣的是,在那种情况下,我只是花了一段时间,我有点尴尬地承认在我的程序中不存在内存泄漏。我希望程序的内存使用量能够通过仪器来反映我程序中的版本。谢谢您的帮助! – Dylan