Objective c 应用程序在UITableview中加载大量数据时崩溃

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

我在uitableview单元格中显示了10多列,有100多行,但当我滚动tableview或重新加载table时,它收到内存警告,应用程序崩溃。 我们还在这个表视图上使用折叠和展开

以下代码应用于cellforrowatindexpath中

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 
});