0

在我看来,我有将近 45UIButton秒,我知道按钮尚未分配到内存,编译器以某种方式分配/释放它,但我注意到设备在这个视图中变得更慢,所以......我该怎么办避免使用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

4 回答 4

4

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

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

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

预加载图像的一种简单方法是通过以下方式实例化它imageNamed

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

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

编辑:

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

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

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

于 2012-10-18T11:18:33.993 回答
0

您可以使用

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

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

于 2012-10-18T11:20:12.713 回答
0

我以这种方式使用自动释放池。这将释放更多在自动释放中创建的内容。我以这种方式将许多自动释放池添加到我的表中以获得更好的性能

@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];

                    }
                }
于 2012-10-18T11:25:46.953 回答
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];
    }
于 2012-10-18T11:41:23.623 回答