2010-04-29 3 views
5

Mon UITableView renvoie EXEC_BAD_ACCESS, mais pourquoi!EXEC_BAD_ACCESS dans UITableView cellForRowAtIndexPath

Regardez cet extrait de code!

Chargement de l'UITableView fonctionne très bien, donc allXYZArray != nil et est rempli!

défiler ensuite le tableview vers le bas et sauvegarder les causes à l'accident, car il va recharger la méthode cellForRowAtIndexPath

Il échoue en ligne:

"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

Pouvez-vous poster le code pour le reste de la méthode avec le code pour [ToolBox getMergedSortedDictionaries: SecondDictionary:]? – MrHen

Répondre

10

EXC_BAD_ACCESS signifie que votre programme tente d'accéder à une adresse mémoire est invalide ou inaccessible de votre processus. Cela se produit le plus souvent lorsque vous essayez d'envoyer un message à un objet qui a déjà été libéré. La première étape du débogage de EXC_BAD_ACCESS consiste donc à déterminer quel objet votre programme essayait d'envoyer un message lorsque le crash s'est produit. Souvent, la réponse n'est pas évidente, dans ce cas, NSZombieEnabled est un excellent outil pour identifier quelle ligne de code a causé l'accident.

Dans votre cas, vous avez déjà déterminé que l'incident se produit lorsque vous appelez [allXYZArray count], ce qui fait de allXYZArray notre principal suspect. Cet objet est retourné de +[ToolBox getMergedSortedDictionaries:SecondDictionary:], donc il est probable que votre bogue soit dans l'implémentation de cette méthode. Je suppose qu'il retourne un objet qui a déjà été libéré au lieu de l'auto-libéré, tel que prescrit par le Memory Management Programming Guide for Cocoa. (D'ailleurs, c'est l'un des documents les plus importants du SDK, je recommande de le relire une fois par mois jusqu'à ce que ses politiques et techniques deviennent une seconde nature.)

1

Ok, la réutilisation d'une cellule, est- ne garantit pas que la cellule sera initialisé correctement:

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
cellule

sera parfois nul (surtout la première fois que je suppose).

Vérifiez la cellule pour la valeur null et si oui, initialisez-la correctement.

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