2010-04-29 20 views
5

Mi UITableView está devolviendo EXEC_BAD_ACCESS, pero ¿por qué?EXEC_BAD_ACCESS en UITableView cellForRowAtIndexPath

¡Vea este fragmento de código!

Cargando UITableView funciona bien, entonces allXYZArray != nil y se completa!

A continuación, el desplazamiento de la tableview hasta el fondo y copia de seguridad de causas que se caiga, ya que va a cargar el método cellForRowAtIndexPath

Se produce un error en la línea:

"NSLog(@"allXYZArray::count: %i", [allXYZArray count]);" 

     (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAt 

IndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"CellIdentifier"; 
UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 


cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
@try 
{ 
if (allXYZArray == nil) { 
    NSLog(@"nil"); 
    allXYZArray = [ToolBox getMergedSortedDictionaries:allXYZGiven SecondDictionary:allXYZSought]; 
} 
NSLog(@"%i", [indexPath row]); 
NSLog(@"allXYZArray::count: %i", [allXYZArray count]); 
+0

Puedes publicar el código para el resto del método junto con el código para [ToolBox getMergedSortedDictionaries: SecondDictionary:]? – MrHen

Respuesta

10

EXC_BAD_ACCESS significa que su programa está intentando acceder a una dirección de memoria que no es válido o de otro modo inaccesibles desde su proceso. Esto ocurre con mayor frecuencia cuando intenta enviar un mensaje a un objeto que ya ha sido desasignado. Entonces, el primer paso en la depuración de EXC_BAD_ACCESS es averiguar a qué objeto intentaba enviar un mensaje el mensaje cuando ocurrió el bloqueo. A menudo la respuesta no es obvia, en cuyo caso, NSZombieEnabled es una gran herramienta para identificar qué línea de código causó el bloqueo.

En su caso, ya ha determinado que el bloqueo ocurre cuando llama al [allXYZArray count], lo que hace que allXYZArray sea nuestro principal sospechoso. Este objeto se devuelve desde +[ToolBox getMergedSortedDictionaries:SecondDictionary:], por lo que es probable que su error esté en la implementación de ese método. Supongo que devolverá un objeto que ya se ha lanzado en lugar de lanzarse automáticamente, como lo prescribe el Memory Management Programming Guide for Cocoa. (Este es uno de los documentos más importantes del SDK, por cierto. Recomiendo volver a leerlo una vez al mes hasta que sus políticas y técnicas se conviertan en una segunda naturaleza.)

1

Ok, la reutilización de una célula, hace no garantiza que la célula se ha inicializado correctamente:

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

celular a veces será nulo (especialmente la primera vez, supongo).

Compruebe si la celda es nula y, de ser así, inicialícela correctamente.

if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
Cuestiones relacionadas