2009-11-29 10 views
5

Tengo un TableView que crea y dibuja bien, pero luego se bloquea al desplazarse por la vista. He corrido a través del depurador y parece que mis variables de nivel de clase se sobrescriben de alguna manera, por lo que ya no existen cuando se llama de nuevo titleForHeaderInSection. Lo extraño es que si puedo reemplazar el código:UITableView se bloquea en el desplazamiento

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
NSString *sectionTitle = [favouritesDataSections objectAtIndex:section]; 
return sectionTitle; 
} 

con:

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
NSString *sectionTitle = @"Test"; 
return sectionTitle; 
} 

Se vuelve a colgarse, pero esta vez las listas depurador no un NSString cuando se pasa sobre la variable sectionTitle.

Este es el código que utilicé para crear la vista y establecer las variables de nivel de clase:

- (void)loadView { 
[super loadView]; 
CGRect tableSize = CGRectMake(0,0,320,460); 
UITableView *favouritesTableView = [[UITableView alloc] initWithFrame:tableSize style:UITableViewStylePlain]; 
favouritesTableView.autoresizingMask = (UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight); 
favouritesTableView.dataSource = self; 
favouritesTableView.delegate = self; 
favouritesTableView.rowHeight = 52; 
[self.view addSubview:favouritesTableView]; 
} 

- (void)viewDidLoad { 
[super viewDidLoad]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
// Get the full path of the favourites plist 
NSString *filename = [documentsDirectory stringByAppendingPathComponent:@"Favourites.plist"]; 
// Initialise Dictionary and array 
favouritesDataAll = [[NSMutableDictionary alloc] init]; 
favouritesDataSections = [[NSArray alloc] init]; 

NSDictionary *dict = [[[NSMutableDictionary alloc] initWithContentsOfFile:filename] retain]; 
favouritesDataAll = dict; 
[dict release]; 

favouritesDataSections = [favouritesDataAll allKeys]; 
} 

voy absolutamente loco tratando de localizar esto abajo - de pasar 2 días en él hasta ahora tan sería externamente agradecido por cualquier ayuda.

Saludos

de Dave

+0

bien, si pongo en retienen al final de la línea UITableView funciona durante unos 3 o cuatro veces y luego la consola da: *** - [longitud UISwipeGestureRecognizer]: Selector no reconocido enviado a la instancia 0x43325d0 –

+0

y también: *** Aplicación de terminación debido a la excepción no detectada 'NSRangeException', razón: '*** - [NSCFArray objectAtIndex:]: índice (0) más allá de los límites (0)' –

+0

OK, me callaré. La retencion era I arenque rojo, creo. Fue porque reemplacé el titleForHeaderInSection por @ "Test" funcionó por un tiempo. El error de la consola es: *** Aplicación de finalización debido a la excepción no detectada 'NSRangeException', razón: '*** - [NSCFArray objectAtIndex:]: índice (57744) más allá de los límites (2)' –

Respuesta

12

OK, se fija ... cambió

favouritesDataSections = [favouritesDataAll allKeys]; 

Para:

favouritesDataSections = [[favouritesDataAll allKeys] retain]; 

Y todo parece funcionar. A partir de esto, deduciría que la matriz que estaba usando para almacenar los encabezados de las secciones apuntaba a datos que se liberaban automáticamente en algún punto al azar, por lo que estaba vomitando en lugares aparentemente extraños.

Debo admitir que todavía estoy en la etapa de "prueba y error" de la codificación y no entiendo completamente lo que estoy haciendo (estoy seguro de que se encogerán al leer esto). Sería útil para mí si tiene enlaces de pensamientos/comentarios para lecturas adicionales o publicaciones sobre cómo funciona todo esto (es decir, cuándo y por qué usar Retener, etc.) para ampliar mi comprensión.

Gracias de nuevo, Dave

+0

Dave, ve y lee las reglas de administración de memoria en la documentación de Apple. Este es un error elemental que no hubieras hecho si hubieras leído un poco antes. – NSResponder

+0

Muy útil. Tuve un problema similar. ¡¡¡¡Gracias!!!! – saimonx

0

Suena como si hubiera algún tipo de daños en la memoria pasando aquí.

Una cosa que veo es que esas llamadas a [super ...] deberían ocurrir después del otro código en esos métodos.

¿Qué sucede si ajusta su tabla vista para que solo tenga una sección?

+0

Hola Greg, gracias por Respuesta rápida. Desafortunadamente, poner el super al final hace que se cuelgue (es decir, el TableView ni siquiera se dibuja). También intenté configurar manualmente el recuento de secciones en 1, el número de filas en la sección en 1 y el título de la sección en @ "Prueba". Todavía se cuelga en el pergamino. –

4

Yo recomendaría el uso de los emisores de @property para evitar este problema, la matriz se autoreleased, por lo que llamó un manual conservan en ella, se ha arreglado el problema, sino una solución más simple sería de usar:

self.favoritesDataSection

esto está automatizado por @property (retener) conservan medios conservan se llama cuando esto se establece, y suelte cuando se establece a cero o un objeto diferente.

Cuestiones relacionadas