简体   繁体   English

滚动时iOS UITableView崩溃

[英]iOS UITableView crashes when scrolling

I ran into a bizarre issue here. 我在这里遇到了一个奇怪的问题。 I'm developping an iOS app (for iPad, specifically), and I'm using an UITableView at some point to display a list of things. 我正在开发一个iOS应用程序(专门针对iPad),并且在某些时候使用UITableView来显示事物列表。

Now, when I scroll inside the bounds of the view (not above first element, and not below the last), it works okay. 现在,当我在视图范围内滚动时(不在第一个元素上方,也不在最后一个元素下方),它可以正常工作。 However, it just crashes violently when I scroll further than that, with no other messages than : 但是,当我进一步滚动时,它只会崩溃,没有其他消息:

  • EXC_BAD_ACCESS when I scroll down to the last element 向下滚动到最后一个元素时为EXC_BAD_ACCESS
  • SIGABRT with a backtrace when I scroll upper than the first 当我滚动到第一个之上时, SIGABRT具有回溯

I looked on Google, and it seems like I'm releasing some objects too much, but I can't figure out which ones. 我在Google上浏览时,似乎释放了太多对象,但是我不知道是哪个对象。

I also tried running the app inside the Instruments, but the Instruments window just freezes each time I run the app, forcing me to kill it by hand... And of course I get no results... 我也尝试过在Instruments内运行该应用程序,但是每次运行该应用程序时,Instruments窗口都会冻结,迫使我用手杀死它...当然,我没有得到任何结果...

Here a bit of the related code : 这里是一些相关的代码:

    /*
     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;
    }

EDIT: UITableView Load and Unload methods : 编辑: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];
}

It seems that, when you add an object, like a new controller, inside the Interface Builder, it is auto-released by default. 似乎在Interface Builder中添加对象(如新控制器)时,默认情况下会自动释放该对象。

If you don't link it with a retained property inside a class, it gets released right after its initialization, causing the dreaded EXC_BAD_ACCESS error. 如果不将其与类中的保留属性链接,则在初始化后立即释放它,从而导致可怕的EXC_BAD_ACCESS错误。

From experience, the big difference between the scrolling within bounds and at bounds is that at bounds it goes through all elements of the tables, including header and footer, and most likely recalculating the number of rows. 根据经验,边界滚动和边界滚动之间的最大区别在于,边界滚动经过表的所有元素(包括页眉和页脚),并且很可能会重新计算行数。 If you have a header and footer try to put breakpoints there. 如果您有页眉和页脚,请尝试在其中放置断点。

Regarding the EXC_BAD_ACCESS you could put a breakpoint in malloc_error_break to hoperfully know more of who is not correctly released. 关于EXC_BAD_ACCESS,可以在malloc_error_break中放置一个断点,以期希望更多地了解谁未正确释放。 This is a symbolic breakpoint to define with the "+" button on the breakpoints window. 这是一个符号断点,可通过“断点”窗口上的“ +”按钮进行定义。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM