2012-10-18 72 views
0

在我看来,我有近45 45 UIButton s,我知道按钮没有被分配到内存,不知何故编译器分配/释放它,但我注意到在这个视图,设备变得更慢,所以...什么我应该如何避免记忆韭菜与UIButtonUIButton内存管理 - 如何管理它?

这是我如何把我的按钮,进入我的观点:

在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; 

} 
+0

请显示一些代码:你如何将按钮添加到视图?你如何创建它们? – sergio

+0

我在.h文件中定义它们 – Mutawe

+0

bt你如何为它们分配内存?你如何释放它?邮政编码! – mayuur

回答

4

他们的内存泄漏你的应用程序不会产生显着的减速。它们的影响正在填满内存,并且如果数量足够多,操作系统会由于内存过度使用而杀死您的应用程序。 (如果操作系统没有杀死你的应用程序,那么你可能会放慢速度,但因为它杀死了应用程序,所以没有问题)。

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

可能你观察速度慢的原因是必须加载到内存中45张图像,从磁盘读取(这很慢)。你可能会想到预加载它们,并看看这是否改善了事情。

一个简单的方法来预加载的图像是通过imageNamed实例吧:

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

你可以调用该方法对于所有的按钮和收集,你可以调用其他方法,例如,所有相关电话,在启动时,或在任何其他适合您的时刻。

编辑:

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

只是注意:您不需要从上海华删除按钮(在正常条件):这将在移除超级视图时由框架完成。可能是这会减慢应用程序的速度吗?另外,如果退出/进入视图时发生问题,您是否可以尝试“缓存”整个视图(如:仅实例化一次,然后在需要时显示它)。

+0

不,我的按钮没有图像。 – Mutawe

+0

我明白了......呃,这只是一个猜测,然后才显示代码......顺便说一下,最初显示视图或准确显示时会发生减速? – sergio

+0

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

0

您可以使用

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

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

+0

你能举个例子吗? – Mutawe

+0

检查我的其他答案。 –

0

我以这种方式使用autorelease池。这将释放autorelease内更多的创建。 我很多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]; 

        } 
       } 
+0

对我不明确 – Mutawe

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]; 
    } 
+0

我已经尝试添加5000个按钮,它仍然不到一秒钟,如果问题仍然存在,您应该检查代码的其他部分 – Anand