UIButton内存管理 - 如何管理它?

时间:2012-10-18 11:11:31

标签: iphone objective-c ios uibutton automatic-ref-counting

我的视图中有近UIButton个,我知道按钮尚未分配给内存,不知何故编译器分配/释放它,但我发现设备在此视图中变慢了,所以...我该怎么做才能避免记忆韭菜与UIButton ??

以下是我将按钮放入视图的方式:

myView.h中的

UIButton *btn1;
myView.m中的

btn1 = [UIButton buttonWithType:UIButtonTypeCustom];
[btn1 setTitle:@"btn1" forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
btn1.backgroundColor = [UIColor clearColor];
btn1.frame = CGRectMake(  arc4random() % 920, arc4random() %600+50  , 65, 65);
[self.view addSubview:btn1];

以及如何删除它:

for(UIButton* b in [self.view subviews]){
    [b removeFromSuperview];
    b = nil;

}

4 个答案:

答案 0 :(得分:4)

内存泄漏本身不会导致应用程序显着减慢。它们的作用是填满内存,如果数量足够,操作系统将因内存过多而终止您的应用程序。 (如果操作系统没有杀死你的应用程序,那么你可能会放慢速度,但是因为它会杀死应用程序,所以没有问题。)

在任何情况下,如果您担心内存泄漏,您可以触发仪器,看看它是否在显示视图时检测到任何内存泄漏。

可能你查看的原因很慢,就是必须加载到内存中的45个图像,从磁盘读取它们(这很慢)。您可能会考虑预加载它们,看看这是否会改善。

预加载图片的简便方法是通过imageNamed实例化它:

 UIImage* img = [UIImage imageNamed:@"myButton1.png"];

您可以为所有按钮调用该方法,并使用您可以调用的其他方法收集所有相关的调用,例如,在启动时,或者在对您有意义的任何其他时刻。

编辑:

  

当我进入视图并退出并重新进入视图等等时

只需注意:您不需要从超级视图中删除按钮(在正常情况下):这将在删除超级视图时由框架完成。可能这会减慢应用程序的速度吗?

此外,如果在退出/进入视图时出现问题,您是否可以尝试“缓存”整个视图(例如:仅实例化一次,然后在需要时显示它)。

答案 1 :(得分:0)

您可以使用

@autoreleasepool {   //You UIButtons creation code goes here  }

将释放在autoreleasepool范围内创建的内存。我使用autoreleasepool作为我的cellForAtIndexPath方法,其中有时我有超过10000行自定义单元格和一些数据库查询。

答案 2 :(得分:0)

我正在以这种方式使用自动释放池。这将释放自动释放内部更多的内容。 我以这种方式向我的表添加了许多autoreleasepool以获得更好的性能

@autoreleasepool {
                    UIButton *btn=(UIButton*)[cell3.contentView.subviews objectAtIndex:btncont];

                    btn.tag=i;
                    [btn addTarget:self action:@selector(MozaicTblBtnSelection:) forControlEvents:UIControlEventTouchUpInside];

                    UIImage* img =  [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@/downloads/%@/files/%@.jpg",del.LocalPath,del.CompFolder,del.RepId,pi.STOCK_CODE]];

                    if(img!=nil)
                    {   
                        [btn setImage:img forState:UIControlStateNormal];

                        [btn.layer setBorderColor:[UIColor blackColor].CGColor];
                        [btn.layer setBorderWidth:1.0];

                    }
                    else
                    {
                        [btn setImage:[UIImage imageNamed:@"no_privew95x77.jpg"] forState:UIControlStateNormal];

                    }
                }

答案 3 :(得分:0)

我希望这可以帮助你...

    UIScrollView *scrlView =[[UIScrollView alloc]initWithFrame:self.view.frame];
    scrlView.tag=123;
    [scrlView  setBackgroundColor:[UIColor blueColor]];

    for(int i=0;i<45;i++)
    {
       UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn1 setTitle:@"OK" forState:UIControlStateNormal];
        btn1.tag=i;
        [btn1 addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
        btn1.backgroundColor = [UIColor clearColor];
        btn1.frame = CGRectMake(  arc4random() % 300, arc4random() %420  , 30, 30);
        [scrlView addSubview:btn1];
    }
    [scrlView setContentSize:CGSizeMake(320, 460)];
    [self.view addSubview:scrlView];

&安培;得到CickEvent

    -(IBAction)btnClicked:(UIButton*)sender
    {
        NSLog(@"Button No :%d Clicked",sender.tag);
    }

&安培;删除你可以做的是

    for(UIButton* b in [[self.view viewWithTag:123] subviews])
    {
        [b removeFromSuperview];
    }
相关问题