2011-06-19 26 views
8

Estoy intentando vaciar un NSMutableArray con [myarray removeallobjects]; pero obtengo el error exc_bad_access. ¿Es esta la manera correcta de vaciar la matriz? Traté de ponerlo a cero, pero tampoco funciona. En realidad, lo que estoy haciendo es llenar la matriz con datos y el usuario tiene la opción de "actualizar" los datos y quiero vaciar la matriz antes de ingresar los datos actualizados. No puedo publicar ningún código porque es demasiado grande.Cómo vaciar correctamente un NSMutableArray

+0

¿Puede agregar la parte donde está agregando los objetos a la matriz? –

+0

[checkinArray addObject: checkinsA]; [checkinsA.taggedID release]; [liberación de checkinsA.taggedName]; [checkinsA release]; donde checkinsA es un objeto personalizado. También este comando está en bucle. – BlackM

Respuesta

57

-[NSMutableArray removeAllObjects] es la manera correcta de vaciar un NSMutableArray. Lo más probable es que tengas un accidente porque aún utilizas los objetos que eliminaste en algún lugar, quizás en tu IU.

+0

O el objeto fue liberado en exceso después de agregarlo a la matriz. –

0

Estás teniendo un bloqueo porque tu matriz ya no existe en la memoria.

apuesto es porque se le olvidó para retenerlo (o se libera demasiado pronto)

Probablemente creado usando [NSMutableArray array] o arrayWithObjects: o algunas de esas variantes, o llamada autorelease después de su alloc + init, mientras que si es una variable de instancia, debes retenerla hasta que el objeto sea desasignado.

Tenga en cuenta que memory mgmt es una parte clave del desarrollo de iOS. Asegúrate de saberlo perfectamente (tal como se vuelve natural y no dudarás en cuándo retenerlo y cuándo soltarlo) antes de seguir adelante, te evitará muchos problemas como este una vez que lo utilices bien.

+0

@property (no atómico, retener) NSMutableArray * checkinArray; en mi .h. checkinArray = [[NSMutableArray alloc] init]; en viewdidload y [checkinArray release]; en dealloc (el último no es el problema porque se cuelga incluso si elimino esta línea de dealloc). ¿Ves algo mal? – BlackM

1

Creo que el problema es en este fragmento de código que usted ha proporcionado en los comentarios,

[checkinArray addObject:checkinsA]; 
[checkinsA.taggedID release]; 
[checkinsA.taggedName release]; 
[checkinsA release]; 

taggedID y taggedName son propiedades del objeto checkinsA. Deben lanzarse en el método dealloc solamente. La matriz no conserva el árbol de objetos. Solo conserva el objeto raíz. Entonces no debería haber un lanzamiento aquí. Así que noquee las dos líneas en el centro y haga que sea

[checkinArray addObject:checkinsA]; 
[checkinsA release]; 
+0

checkinsA.taggedID y taggedName son NSMutableArrays en los checkinsA. También checkinsA está en un bucle for. – BlackM

+0

para (usuarios de NSDictionary * en usuarios) { Checkin * checkinsA = [[Checkin alloc] init]; checkinsA.taggedName = [[NSMutableArray alloc] init]; checkinsA.taggedID = [[NSMutableArray alloc] init]; ...... [checkinArray addObject: checkinsA]; [checkinsA.taggedID release]; [liberación de checkinsA.taggedName]; [checkinsA release]; – BlackM

Cuestiones relacionadas