滚动UItableView并回击时崩溃应用程序

时间:2011-09-20 09:01:59

标签: objective-c ios xcode

我正在使用导航控制器来访问UITableView。在这个UItableView中,有一个搜索栏和50个单元格。当我不滚动然后回击时,应用程序正常运行但当我向下滚动10个单元格然后回击时,我的应用程序崩溃与EXC_BAD_ACCESS错误。任何想法可能是这次崩溃的原因?

在dealloc中,我将释放我在头文件中创建的所有对象:

- (void)dealloc
{

[listContent release];
[filteredListContent release];
[tmpCell release];
[cellNib release];

[super dealloc];
}

并且对于创建单元格的函数,它如下:(注意我正在使用searchBar执行备用UItableView)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *kCellID = @"cellID";

ApplicationCell *cell = (ApplicationCell *)[tableView dequeueReusableCellWithIdentifier:kCellID];
if (cell == nil)
{
    [self.cellNib instantiateWithOwner:self options:nil];
    cell = tmpCell;
    self.tmpCell = nil;
}

/*
 If the requesting table view is the search display controller's table view, configure the cell using the filtered content, otherwise use the main list.
 */
NSDictionary *dataItem;
if (tableView == self.searchDisplayController.searchResultsTableView)
{
    dataItem = [self.filteredListContent objectAtIndex:indexPath.row];
}
else
{
    dataItem = [self.listContent objectAtIndex:indexPath.row];
}

// Display dark and light background in alternate rows -- see tableView:willDisplayCell:forRowAtIndexPath:.
cell.useDarkBackground = (indexPath.row % 2 == 0);

// Configure the data for the cell.

cell.icon = [UIImage imageNamed:@"iTaxi.jpeg"];
cell.publisher = [dataItem objectForKey:@"Number"];
cell.name = [dataItem objectForKey:@"Name"];
cell.price = [UIImage imageNamed:@"order-taxi.png"];

return cell;
 }

ViewDidUnload与dealloc

具有相同的代码

3 个答案:

答案 0 :(得分:0)

这是因为为可见行重新创建了单元格。也就是说,当您滚动tableView时,将为可见行调用cellForRowAtIndexPath。删除cellForRowAtIndexPath中的条件if(cell==nil)。你能分享你的代码吗?

答案 1 :(得分:0)

发生该错误是因为您的代码中某处将scrollEnabled设置为“NO”(可能是在您激活搜索栏时):

self.tableView.scrollEnabled = NO;

我的意思是,如果您的searchText length等于0(您刚刚进入搜索模式),则无法禁用该表视图滚动。

希望这有助于你。

祝你好运,编码好!

FábioDemarchi

答案 2 :(得分:0)

当您在滚动表视图时按下后,应用程序将崩溃,因为调用了已释放的tableview实例的数据源(很少委托)协议的方法。因此我们可以获得崩溃,因为我们正在访问已解除分配的实例。

为避免这种情况,只需在特定的视图控制器类中添加 dealloc 方法,并将相应的协议设置为nil。

-(void)dealloc {

   self.yourTableView.delegate = nil;
   self.yourTableView.dataSource = nil;
}

快乐编码:)