Ok, tengo una UIViewTable y una UISearchBar con dos botones de alcance. La idea es que cuando presiono un botón de alcance, se cambia el origen de datos para UIViewTable, pero obtengo el error EXC_BAD_ACCESS.iphone EXC_BAD_ACCESS con NSMutableArray
he el código siguiente en mi UIViewController SearchViewController.m:
- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange: (NSInteger) selected scope
{
MyAppDelegate *delegate = (MyAppDelegate *) [[UIApplicationsharedApplication] delegate];
if (self.listData != nil) {
[self.listData release];
}
if (selectedScope == 0) {
self.listData = [delegate.data getListOne];
}
else {
self.listData = [delegate.data getListTwo];
}
}
- (void) viewDidLoad {
MyAppDelegate *delegate = (MyAppDelegate*) [[UIApplication sharedApplication] delegate];
self.listData = [delegate.data getListOne];
//some other unrelated code
}
en mi SearchViewController.h tengo:
@property (nonatomic,retain) NSMutableArray *listData;
en mi Data.m tengo:
-(NSMutableArray *) getListOne {
NSMutableArray *list = [[NSMutableArray alloc] initWithObjects:@"test1",
@"test2",
nil];
[list autorelease];
return list;
}
-(NSMutableArray *) getListTwo {
NSMutableArray *list = [[NSMutableArray alloc] initWithObjects:@"test3",
@"test4",
nil];
[list autorelease];
return list;
}
Se bloquea en:
self.listData = [delegate.data getListTwo];
Comprobé que es cuando estoy estableciendo la propiedad que se bloquea. Tengo entendido que cuando creo el nuevo NSMutableArray en Data.m lo asigno de manera automática como debería.
Cuando se carga la vista, la asigno a mi listData y como estoy accediendo a la propiedad que se ha retenido, el recuento de referencias se incrementa (por lo que ahora es 2 autorizaciones pendientes).
Cuando presiono el botón para cambiar la fuente de datos, compruebo también si aparece listData (que siempre lo hará), suéltelo para que el contador NSMutableArray antiguo sea 0 (suponiendo que se haya producido la liberación automática).
Luego obtengo un nuevo NSMutableArray y lo configuro en esta propiedad ... ¿es correcto mi entendimiento? He gastado demasiado tiempo en este simple problema :(
oh también creé otro NSMutableArray que no estaba conectado a tableView y todavía tengo el mismo problema, también si no lo lanzo en mi sentencia if el problema no existe, pero entonces tendrá una pérdida de memoria ?? yo siempre podría simplemente mantener la matriz y eliminar/añadir objetos, pero quiero saber por qué esto no está funcionando :) aplausos
Al igual que un consejo de estilo, puede simplificar sus métodos getListOne/getListTwo de varias maneras. Por ejemplo, podría combinar las últimas 2 líneas de cada una en retorno [lista de liberación automática]. Puede condensarlo en una sola línea devolviendo una matriz liberada automáticamente generada con + arrayWithObjects en lugar de + alloc y -initWithObjecs: - significa lo mismo pero es un poco más corto. :-) –