EXEC_BAD_ACCESS with cellForRowAtIndexPath,再次

问题描述:

我有另一个UITableView的问题,应用程序崩溃后重新加载tableView后从互联网加载数据,崩溃发生在cellForRowAtIndexPath方法显式地方。 我的thin i我仍然不完全明白究竟是什么意思回收细胞。 感谢您的帮助EXEC_BAD_ACCESS with cellForRowAtIndexPath,再次

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

UILabel *venueName; 
UIImageView *logo; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) 
{ 
    NSLog(@">>> GIT 1<<<"); 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 

    venueName = [[UILabel alloc] initWithFrame:CGRectZero]; 
    [venueName setLineBreakMode:UILineBreakModeWordWrap]; 
    [venueName setMinimumFontSize:FONT_SIZE]; 
    [venueName setNumberOfLines:0]; 
    [venueName setFont:[UIFont systemFontOfSize:FONT_SIZE]]; 
    [venueName setTag:1]; 
    venueName.backgroundColor = [UIColor clearColor]; 
    [[cell contentView] addSubview:venueName]; 

    logo = [[UIImageView alloc] initWithFrame:CGRectZero]; 
    [logo setTag:10]; 
    [[cell contentView] addSubview:logo]; 

    cell.backgroundView = [[[UIImageView alloc] init] autorelease];//new 
} 

NSMutableDictionary *oneVenue ; 

if ([self.venueList count] > 0) { 

    oneVenue = [self.venueList objectAtIndex:indexPath.row]; 

    if (!venueName) { 
    venueName = (UILabel*)[cell viewWithTag:1]; 
    } 
    [venueName setText:[oneVenue objectForKey:@"Name"]]; // <===CRASH!!! 
    [venueName setFrame:CGRectMake(CELL_CONTENT_MARGIN,CELL_VENUE_LEVEL ,80 , 30)]; 

    [logo setImage:[UIImage imageNamed:@"event.png"]]; 
    [logo setFrame:CGRectMake(10, 5, 76, 60)]; 

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    UIImage *rowBackground; 

    rowBackground = [UIImage imageNamed:@"evbgd_yell.png"]; 

    ((UIImageView *)cell.backgroundView).image = rowBackground; 
} 

return cell; 
} 
+0

p.s.有人可以告诉如何放置代码,使其看起来像代码? – Mapedd 2010-08-11 20:36:49

+0

这是010101按钮。 – mvds 2010-08-11 20:39:57

我大胆猜测,你self.venueList包含无效指针,你标记的代码行提领时如此崩溃。

+0

venueList的确定,好吧,我已通过枚举检查它 – Mapedd 2010-08-12 10:38:21

  1. 您是否尝试过构建和分析?它有时可以帮助这样的事情。
  2. 尝试初始化venueName在您声明时为零。 C中的临时变量在默认情况下不会被初始化,因此当您不希望它变为时,您的if (!venueName)可能会被绕过。

看起来像你正在使用的场地名称没有初始化它在你重用单元格的情况下。

您有:

UILabel *venueName; 

再后来:

[venueName setText:[oneVenue objectForKey:@"Name"]]; // <===CRASH!!! 

在你分配你设置venueName细胞,但当细胞被重用它不发生的情况。要解决您应该只需要:

UILabel *venueName = nil; 
+0

关键是检查if(!venueName)将无法正常工作,因为它是一个未初始化的值非零。 – 2010-08-11 22:11:27