为什么这些UITableViewCell会导致仪器泄漏?

时间:2009-09-17 20:50:04

标签: iphone cocoa-touch

因此,经过大量老式的评论调试后,缩小了仪器的泄漏范围。当我将一个新的TableViewController推入堆栈时会发生泄漏。

我发现我从这段代码中泄漏:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell;
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}

if(![feedData isFinishedLoading]){
    [[cell textLabel] setText:@"Loading..."];
    [[cell detailTextLabel] setText:@"..."];
}
else{
    NSDictionary *dict = [[feedData items] objectAtIndex:indexPath.row];
    [[cell textLabel] setText:[dict valueForKey:@"title"]];
    [[cell detailTextLabel] setText:[dict valueForKey:@"description"]];
    [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];
}
return cell;
}

此版本不会泄漏:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell;
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}

//  if(![feedData isFinishedLoading]){
//      [[cell textLabel] setText:@"Loading..."];
//      [[cell detailTextLabel] setText:@"..."];
//  }
//  else{
//      NSDictionary *dict = [[feedData items] objectAtIndex:indexPath.row];
//      [[cell textLabel] setText:[dict valueForKey:@"title"]];
//      [[cell detailTextLabel] setText:[dict valueForKey:@"description"]];
//      [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];
//  }
return cell;
}

这个版本确实:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell;
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}

//  if(![feedData isFinishedLoading]){
        [[cell textLabel] setText:@"Loading..."];
        [[cell detailTextLabel] setText:@"..."];
//  }
//  else{
//      NSDictionary *dict = [[feedData items] objectAtIndex:indexPath.row];
//      [[cell textLabel] setText:[dict valueForKey:@"title"]];
//      [[cell detailTextLabel] setText:[dict valueForKey:@"description"]];
//      [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];
//  }
return cell;
}

这是乐器的屏幕上限:

http://imgur.com/YR8k8

我的代码中的问题出在哪里?或者它是框架/模拟器中的错误?

1 个答案:

答案 0 :(得分:0)

泄漏堆栈中没有任何东西可以调用您的代码,因此我不知道您是否可以删除它。我知道一个大红色尖峰是可怕的,但它只有16个字节。 Apple并不完美,也许代码中的某些东西正在做。也许您可以尝试使用点访问器来查看是否有帮助

cell.textLabel.text = @"Loading...";
cell.detailTextLabel.ext = @"...";