2010-04-29 7 views
5

mio UITableView sta tornando EXEC_BAD_ACCESS, ma perché!EXEC_BAD_ACCESS in UITableView cellForRowAtIndexPath

Vedere questo snippet di codice!

Caricamento del UITableView funziona bene, così allXYZArray != nil ed è popolato!

Poi scorrendo la Tableview al fondo ed eseguire il backup cause il crash, come va di ricaricare il metodo cellForRowAtIndexPath

Fallisce on line:

"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

Puoi pubblicare il codice per il resto del metodo insieme a il codice per [ToolBox getMergedSortedDictionaries: SecondDictionary:]? – MrHen

risposta

10

EXC_BAD_ACCESS significa che il programma sta tentando di accedere ad un indirizzo di memoria che non è valido o altrimenti inaccessibili dal vostro processo. Questo accade più comunemente quando provi a inviare un messaggio a un oggetto che è già stato deallocato. Quindi il primo passo nel debug di EXC_BAD_ACCESS è capire quale oggetto il tuo programma stava cercando di inviare un messaggio a quando si è verificato l'arresto anomalo. Spesso la risposta non è ovvia, nel qual caso, NSZombieEnabled è un ottimo strumento per identificare quale riga di codice ha causato l'arresto anomalo.

Nel tuo caso hai già stabilito che l'arresto si verifica quando chiami [allXYZArray count], facendo del nostro primo sospettato il numero allXYZArray. Questo oggetto viene restituito da +[ToolBox getMergedSortedDictionaries:SecondDictionary:], quindi è probabile che il bug sia nell'implementazione di tale metodo. Direi che restituisce un oggetto che è già stato rilasciato invece di autoreleased, come prescritto dallo Memory Management Programming Guide for Cocoa. (A proposito, questo è uno dei documenti più importanti dell'SDK. Suggerisco di rileggerlo una volta al mese fino a quando le sue politiche e le tecniche diverranno una seconda natura.)

1

Ok, il riutilizzo di una cella, fa non garantisce che la cella verrà inizializzata correttamente:

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

cella a volte sarà nullo (soprattutto la prima volta credo).

Controllare cella per nulla e, in caso affermativo, inizializza correttamente.

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