我的视图中有近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;
}
答案 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];
}