What does the iOS error “request for rect of invalid section” mean?

Google reveals no posts at all for this error message. I’m getting it in iOS 5 trying to update a UITableView. While the exact code is a bit tortured, this is what I’m doing to the table and the NSMutableArray that has the table data. The calls are made from off of the main thread via performSelectorOnMainThread calls, as indicated in the code snippets below. The NSMutableArray sections is an array of arrays, each representing a section, where these secondary arrays are NSStrings with the text that appears in the table.

From off of the main thread:

[table performSelectorOnMainThread: @selector(beginUpdates) withObject: nil waitUntilDone: YES];

The main code called from another performSelectorOnMainThread:

// Make sure the requested section exists.
if (sections == nil)
    sections = [[NSMutableArray alloc] init];
while (section >= [sections count]) {
    NSMutableArray *newArray = [[NSMutableArray alloc] init];
    [sections addObject: newArray];

    [table insertSections: [NSIndexSet indexSetWithIndex: [sections count]] 
                                        withRowAnimation: UITableViewRowAnimationNone];
}

// Insert the new row in the section.
NSMutableArray *rowArray = [sections objectAtIndex: section];
if (row > [rowArray count])
    row = [rowArray count];
[rowArray insertObject: cellString atIndex: row];

[table insertRowsAtIndexPaths: [NSArray arrayWithObject: [NSIndexPath indexPathForRow: row inSection: section]]
             withRowAnimation: UITableViewRowAnimationNone];

Called after the above code completes:

[table performSelectorOnMainThread: @selector(endUpdates) withObject: nil waitUntilDone: YES];

The error is occurring on this call to endUpdates. The exact error message is:

  • Stripe and Apple Pay not working in iOS App
  • NSURLConnection sendAsynchronousRequest:queue:completionHandler: making multiple requests in a row?
  • How to activate Cycles reporting in Instruments under ARC?
  • What does the /private prefix on an iOS file path indicate?
  • Some sort of “global” for IBDesignables?
  • Objective C - sample Singleton implementation
  • 2012-01-04 14:28:10.951 myApp[2183:fb03] *** Assertion failure in -[UITableViewRowData rectForSection:], /SourceCache/UIKit_Sim/UIKit-1912.3/UITableViewRowData.m:1449
    2012-01-04 14:28:10.953 myApp[2183:fb03] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for rect of invalid section (1)'
    *** First throw call stack:
    (0x1833052 0x1d94d0a 0x17dba78 0x11472db 0x99c832 0xa1b93b 0xa1b886 0xa1b451 0xa28134 0x8458e1 0x842602 0x84d211 0x84d23f 0x1834e72 0x10d69ef 0x180797f 0x176ab73 0x176a454 0x1769db4 0x1769ccb 0x33b6879 0x33b693e 0x7bea9b 0x1fad 0x1f25)
    terminate called throwing an exception
    

    What does this error mean, and what do I need to change to avoid it?

    3 Solutions Collect From Internet About “What does the iOS error “request for rect of invalid section” mean?”

    Looks like your code is trying to work with a section of your table that does not exist.

    Since NSArrays are zero-indexed, the index value of count will be outside the bounds of the array. You should subtract one from the count when using indexSetWithIndex: here:

    [table insertSections: [NSIndexSet indexSetWithIndex: [sections count]-1] 
                                        withRowAnimation: UITableViewRowAnimationNone];
    

    Posting as answer in case it happens to somebody else as well.

    I found the issue looking at jonkroll’s answer, but in my case this happened because I was calling the same method twice and that method removed a row from the table view.

    Leaving this here as well as a separate possible cause.

    If you are trying to delete rows in the moveRowAtIndexPath: method you will get the same crash. You have to wait until it finishes to do that.