简体   繁体   中英

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.

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
  • SIGABRT with a backtrace when I scroll upper than the first

I looked on Google, and it seems like I'm releasing some objects too much, but I can't figure out which ones.

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...

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 :

- (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.

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.

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. This is a symbolic breakpoint to define with the "+" button on the breakpoints window.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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