Objective c 应用程序在UITableview中加载大量数据时崩溃
我在uitableview单元格中显示了10多列,有100多行,但当我滚动tableview或重新加载table时,它收到内存警告,应用程序崩溃。 我们还在这个表视图上使用折叠和展开 以下代码应用于cellforrowatindexpath中Objective c 应用程序在UITableview中加载大量数据时崩溃,objective-c,ios,cocoa-touch,uitableview,Objective C,Ios,Cocoa Touch,Uitableview,我在uitableview单元格中显示了10多列,有100多行,但当我滚动tableview或重新加载table时,它收到内存警告,应用程序崩溃。 我们还在这个表视图上使用折叠和展开 以下代码应用于cellforrowatindexpath中 for(i=0;i<[appDel.tempItemDic count];i++) { UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake
for(i=0;i<[appDel.tempItemDic count];i++)
{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(CNT+30, -30, 350,100)];
label.font = [UIFont systemFontOfSize:14.0];
label.text =[tempDic objectForKey:[appDel.arrColumnList objectAtIndex:[[appDel.tempArr objectAtIndex:i]intValue]]];
label.textAlignment = UITextAlignmentLeft;
label.textColor = [UIColor whiteColor];
label.backgroundColor=[UIColor clearColor];
label.numberOfLines=1;
[cell.contentView addSubview:label];
[label release];
backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"ListItems_secondLevel(3).png"]];
cell.backgroundView = backgroundView;
cell.imageView.image=[UIImage imageNamed:@"arrow.png"];
CNT+=350;
}
对于(i=0;i您只需要在创建单元格时创建UILabel
s。在重用单元格时,您可以使用tag
获取UILabel,并将值设置为该值。不要反复创建
编辑:
除此之外,正如Sarah提到的,您不需要在循环中执行此操作。对于每个单元格,将调用该方法,并且您可以根据indexPath设置值。您不需要在方法中使用for loop
。因为objectatIndex
的作用相同。请删除for循环,因为您已经在使用objectatIndex请取消>并重试。可能您没有重用单元格。因此,如果您创建100个单元格,并且每个单元格同时有10个标签,则UILabel视图将全部保存在内存中。
您应该以这种方式重用单元格(代码未经测试,只是为了给您一个想法,我不是在评论您创建文本的方式,我只关心内存警告):
-(UITableViewCell*)tableView:(UITableView*)tv cellForRowAtIndexPath:(NSIndexPath*)indexPath{
//在此处添加代码以获取列数;我假设您在代码中的某个位置定义了“GetNumberOfColumnsForrowatineXPath:”来检索此图
NSInteger numberOfColumns=[appDel GetNumberOfColumnsFrrowatIndeXPath:indexPath];
NSString*cellId=[NSString stringWithFormat:@“MyComplexCellID_u%d”,numberOfColumns];
UITableViewCell*单元格=[tv dequeReusableCellWithIdentifier:cellId];
如果(!单元格){
//在这里,您可以创建单元格并添加标签;不要在这里为标签提供文本
//为了得到正确的标签,给他们一个标签;例如,500是第0列,501是第1列,。。。
对于(int i=0;i如果在表视图中加载大量数据,我建议您
1:-
2:-
在服务器响应的方法中-
(void)methodForServerResponse{
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(q, ^{
NSLog(@"DISPATCH_QUEUE_PRIORITY_HIGH - Main Thread within Main Thread");
//implement what you stuff need from server
});
但是,我正在为循环的每次迭代创建新的uilabel对象,因为假设我们在tableview中没有10个列,那么我将不得不创建10个新的uilabel对象来显示每个列的值,所以请告诉我如何处理这种情况。但这是我的应用程序的功能,我们可以添加动态的列数,它们不是固定的o列数。您可以根据列数生成自定义ID:1.获取列数“num”:2.创建cellID:cellID=[NSString stringWithFormat:@“MyCellID_u%d”,num];3.使用该cellID至少可以减少重复单元格的数量。占用的内存更多,但不是您现在获得的大量内存。请参阅我编辑的答案;现在您首先获得numberOfColumns(我假设您定义了一个函数来完成此操作),然后根据该数字定义特定的cellID(因此,您将根据列数拥有不同类型的单元格),最后您将创建单元格。@SONOFGOD:您正在方法中创建UILabel,并且每次都会重新初始化。因此,您不需要执行“for循环”但是,我们使用forloop来显示每个单元格的动态列号及其值。因此,当CellForRowatinex调用上述循环时,运行for no of column来显示每个列的值。这不是UITable的工作方式。下面是一篇博客文章解释。
(void)viewDidLoad {
[super viewDidLoad];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableview reloadData];
});
}
(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(q, ^{
NSLog(@"DISPATCH_QUEUE_PRIORITY_HIGH - Main Thread");
[self methodForServerResponse];
});
}
(void)methodForServerResponse{
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(q, ^{
NSLog(@"DISPATCH_QUEUE_PRIORITY_HIGH - Main Thread within Main Thread");
//implement what you stuff need from server
});