¿Qué significa el error de iOS "request de rect de la sección inválida"?

Google no revela ninguna publicación en absoluto para este post de error. Lo estoy obteniendo en iOS 5 tratando de actualizar una UITableView. Mientras que el código exacto es un poco torturado, esto es lo que estoy haciendo en la tabla y el NSMutableArray que tiene los datos de la tabla. Las llamadas se realizan desde fuera del hilo principal a través de llamadas performSelectorOnMainThread, como se indica en los fragments de código a continuación. Las secciones NSMutableArray son una matriz de matrices, cada una representa una sección, donde estas matrices secundarias son NSStrings con el text que aparece en la tabla.

Desde fuera del hilo principal:

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

El código principal llamado desde otro 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]; 

Llamado después de que el código anterior se complete:

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

El error ocurre en esta llamada a endUpdates. El post de error exacto es:

 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 

¿Qué significa este error y qué debo cambiar para evitarlo?

Parece que su código intenta trabajar con una sección de su tabla que no existe.

Dado que NSArrays están indexados por cero, el valor del índice de la count estará fuera de los límites de la matriz. Debería restar uno del recuento cuando use indexSetWithIndex: aquí:

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

Publicar como respuesta en caso de que también le pase a alguien más.

Encontré el problema mirando la respuesta de jonkroll, pero en mi caso esto sucedió porque estaba llamando al mismo método dos veces y ese método eliminó una fila de la vista de tabla.

Dejando esto aquí, así como otra causa posible.

Si está tratando de eliminar filas en el método moveRowAtIndexPath: obtendrá el mismo locking. Tienes que esperar hasta que termine de hacer eso.