内存泄漏发现,但我找不到它?

时间:2011-10-20 01:44:09

标签: iphone

在我的应用程序上使用Run-> Run with Performance tool-> Leaks后,它发现了泄漏,但我不知道这个工具是否是一个小问题?

  1. 我通过选择一个按钮启动应用程序,该按钮打开一个tableview(无泄漏)。
  2. tableview出现,如果我没有碰到任何东西(没有泄漏)。
  3. 如果我选择第一个单元格并且光标闪烁(3到4秒后,泄漏)??
  4. 我确实发现了一些奇怪的东西,在我的tableview中,如果我尝试选择任何其他单元格,除了第一个单元格之外,它不会成为第一个响应者(这可能与任何事情无关)?

    如果有人碰到过这个或者可以发现或指示我到达可能发生的地方,请告诉我?谢谢。

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) { 
       cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];  
    }    
          // Configure the cell... 
       UITextField *FirstField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 130, 25)];
       FirstField.delegate = self;
       FirstField.tag = indexPath.row; [cell.contentView addSubview:FirstField]; 
       FirstField.returnKeyType = UIReturnKeyNext; 
       [FirstField release];
       return cell; 
    }
    

1 个答案:

答案 0 :(得分:1)

内存泄漏是由于每次调用函数时都要分配UITextField并将其添加到单元格。

重复使用单元格,每次访问单元格以确定内容时,新的UITextField将添加到单元格中并堆叠在一起

将FirstField的分配移动到分配单元格的位置,以便可以重复使用。

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) { 
   cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];  
   UITextField *FirstField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 130, 25)];
   FirstField.tag = 1
   [cell.contentView addSubview:FirstField];
   [FirstField release];
}    
UITextField *field = (UITextField *)[cell.contentView viewWithTag:1];
field.delegate = self;
field.returnKeyType = UIReturnKeyNext; 
return cell; 

我还看到你使用field.tag来存储单元格的indexPath.row值,因为你可能需要搜索cell.contentView的视图hirachy来查找TextField子视图。