滚动时iOS UITableView崩溃

时间:2011-10-04 22:02:54

标签: ios uitableview scroll exc-bad-access

我在这里遇到了一个奇怪的问题。我正在开发一个iOS应用程序(专门用于iPad),我在某个时候使用UITableView来显示一系列内容。

现在,当我在视图的边界内滚动(不在第一个元素上方,而不是在最后一个元素下方)时,它可以正常工作。但是,当我进一步滚动时,它只是剧烈崩溃,没有其他消息:

    向下滚动到最后一个元素
  • EXC_BAD_ACCESS
  • SIGABRT 当我滚动比第一个
  • 时有回溯

我看了谷歌,似乎我发布了一些太多的对象,但我无法弄清楚哪些对象。

我也尝试在乐器内部运行应用程序,但是每次运行应用程序时,“仪器”窗口都会冻结,迫使我手动杀死它......当然,我没有结果......

这里有一些相关的代码:

    /*
     Returns the cells of the table view
     */
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // Create a new cell view
        static NSString *CellIdentifier = @"Cell";

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

        // Configure the cell...
        cell.textLabel.text = [newestModules objectAtIndex:indexPath.row];
        cell.textLabel.textColor = [UIColor whiteColor];
        cell.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"Background-Texture-Dark-Small.png"]];
        cell.imageView.image = [UIImage imageNamed:@"Icon-Maths.png"];

        UIView *v = [[[UIView alloc] initWithFrame:cell.frame] autorelease];

        // Set view background color
        v.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Background-Texture-Dark-Small.png"]];

        // This view will be activated when the cell is selected
        cell.selectedBackgroundView = v;

        return cell;
    }

编辑:UITableView加载和卸载方法:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Transparent background
    self.tableView.backgroundView = nil;

    // Generate list of newest modules. Will later look for them on the internet, but for now we only add some test examples.
    newestModules = [[NSMutableArray alloc] initWithObjects:@"Test 1", @"Test 2", @"Test 3", @"Test 4", @"Test 5", nil];
}

- (void)viewDidUnload
{
    [newestModules release];
    [super viewDidUnload];
}

2 个答案:

答案 0 :(得分:1)

当您在Interface Builder中添加一个对象(如新控制器)时,默认情况下它是自动释放

如果你没有将它与类中的保留属性相关联,它会在初始化后立即释放,从而导致可怕的 EXC_BAD_ACCESS 错误。

答案 1 :(得分:0)

根据经验,在界限内和边界处滚动之间的最大区别在于它在界限中遍历表格的所有元素,包括页眉和页脚,并且很可能重新计算行数。如果你有一个页眉和页脚尝试在那里放置断点。

关于EXC_BAD_ACCESS,您可以在malloc_error_break中放置一个断点,以便更好地了解更多未正确发布的人。这是一个符号断点,用断点窗口上的“+”按钮定义。