EXC_BAD_ACCESS 仅在从 UITableView 中一直向下滚动返回时

Posted

技术标签:

【中文标题】EXC_BAD_ACCESS 仅在从 UITableView 中一直向下滚动返回时【英文标题】:EXC_BAD_ACCESS only when returning from scrolling all the way down in a UITableView 【发布时间】:2013-12-14 22:34:22 【问题描述】:

EXC_BAD_ACCESS(代码=1,地址=0x71474b80)

当用户在嵌套的 UITableView 中一直向下滚动返回时会出现此错误。如果我不滚动到底部,则不会发生错误。

可能存在按照建议的释放问题

UIViewTableController: "EXC_BAD_ACCESS" When Scrolling Up/Down Past the Max Position of the Table

我的代码是:

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

    static NSString *CellIdentifier = @"TroncalesInfo";

    TroncalesViewCell *cell = [[TroncalesViewCell alloc]init];
    cell = [tabla dequeueReusableCellWithIdentifier:CellIdentifier];
    cell.IDTroncal = [nombresTroncales objectAtIndex:indexPath.row];

    [cell setCellAtributes:indexPath db:dataBase];

    return cell;

【问题讨论】:

【参考方案1】:

这是我经常使用的一个小技巧。我不知道它为什么会起作用,但请尝试一下;)。

在你的 viewController 的 viewWillDisappear 中插入这个:

tabla.delegate = nil;

【讨论】:

你是对的亚伦。抱歉没有解释。在我看来,视图控制器或表的委托在视图滚动时被释放(scrollViewDidScroll?)。由于 UITableView 继承自 UIScrollView,强制它为 nil 取消所有对 UITableViewDelegate 协议的调用,包括 scrollViewDidScroll。如果我错了亚伦,请纠正我。【参考方案2】:

我不知道这是否是您的问题的根源,但是这段代码:

TroncalesViewCell *cell = [[TroncalesViewCell alloc]init];
cell = [tabla dequeueReusableCellWithIdentifier:CellIdentifier];

应该更接近这个:

TroncalesViewCell *cell = [tabla dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) 
    cell = [[TroncalesViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

我认为您现有的代码可能会返回一个nil 单元格,这会引发异常。现在,您正在毫无意义地初始化一个单元格,然后将其丢弃并用另一个单元格替换。

【讨论】:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath static NSString *CellIdentifier = @"TroncalesInfo"; TroncalesViewCell *cell = [tabla dequeueReusableCellWithIdentifier:CellIdentifier]; if(!cell) cell = [[TroncalesViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.IDTroncal = [nombresTroncales objectAtIndex:indexPath.row]; [单元集CellAtributes:indexPath db:dataBase];返回单元格; 这样做了,但还是不行!!! 使用 Objective-C 启用僵尸对象检查:D [TroncalesViewController scrollViewDidScroll:]: 消息发送到已释放实例 0x18462d40 看起来你的 tableview 在它仍然可见的时候被释放了。你有强烈的参考吗?【参考方案3】:

从崩溃日志来看,TroncalesViewController 的委托似乎在不应该的时候被重新分配。您可以检查以确保在滚动视图时 TroncalesViewController 的委托仍然存在。

【讨论】:

以上是关于EXC_BAD_ACCESS 仅在从 UITableView 中一直向下滚动返回时的主要内容,如果未能解决你的问题,请参考以下文章

EXC_BAD_ACCESS 仅在运行 iOS 8 的 xcode 8 上

读取 NSFetchedResultsController 的 fetchedObjects 属性时出现 EXC_BAD_ACCESS 错误(仅在模拟器上)

Nativescript throwing Thread 1: EXC_BAD_ACCESS (code=1, address=0x1edf38) 仅在 Xcode

如何仅在从 Firebase 下载数据后执行操作

我的 PowerShell 脚本仅在从 ISE 运行时才有效

仅在从 Windows 运行时出现 500 内部错误 (7)