2009-12-01 9 views
51

He declarado NSMutableArray *categories en mi controlador de vista .h archivo, y he declarado una propiedad para él.NSMutableArray addObject no funciona

En el método de la NSXMLParser delegado en mi archivo .m parser:foundCharacters:, tengo este código:

-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string 
{ 
    if (elementFound) 
    { 
     element = string; 
     [self.categories addObject:element]; 
    } 
} 

Pero cuando se ciernen sobre la línea [self.categories addObject:element] después de entrar en él en modo de depuración, XCode me dice a la el tamaño es 0x0, 0 objetos. Hay 3 elementos en mi archivo XML, así que 3 elementos deberían estar en la matriz.

Me falta algo muy obvio y no puedo entender qué.

+3

Para su publicación futura: la forma de formatear el código es seleccionar el bloque de código, y sangrar todo 4 espacios usando el botón formateador "código" en la parte superior del editor de publicaciones. –

+0

lo siento - he copiado y pegado desde otro foro, ¡adivine que el formato no fue demasiado! gracias – joec

Respuesta

140

La parte "0x0" es una dirección de memoria. Específicamente, "nil", lo que significa que su matriz mutable no existe en el momento en que se está llamando. Trate de crear en su método init:

categories = [[NSMutableArray alloc] init]; 

No se olvide de liberar en su -dealloc.

+11

No sé por qué me olvido de hacer esto. Gracias. – James

+17

(Actualización de 2012: si usa ARC, se puede ignorar la publicación release/dealloc). –

+4

¡Gracias! Es fácil olvidar que los mensajes a nulas referencias de objetos no fallan en Objective-C. – JasonD

6

inicializar una matriz vacía utilizando

categories = [NSMutableArray array]; 

El método de la clase de matriz son autoreleased así que no hay necesidad de liberar.

+0

Vishu: su solución está funcionando, pero creo que la solución de Joshua Nozzi es mejor, ya que necesita menos memoria. –

+0

Esto es funcionalmente equivalente a mi respuesta de cinco años y medio más, simplemente usando el método de conveniencia en lugar de alloc/init. No hay diferencia en el uso de memoria y el resultado es exactamente el mismo. –

-2
@property (Strong, nonatomic) NSMutableArray * yourArray; 

que tienen que utilizar fuerte.

+0

Esto no responde a la pregunta: la matriz no está inicializada, por lo que no existe (por lo que es nula). Además, 'strong' es el valor predeterminado para las propiedades de ObjC 2, pero no sabemos nada sobre cómo se declara desde el código proporcionado; todo lo que sabemos es que no existe en tiempo de ejecución y parece ser un ivar de una clase, por lo que solo sabemos que el problema es que no se asigna una matriz en el momento en que se llama al método. * Puede * haber sido creado en el momento inicial y eliminado en otro lugar. Mi punto es que esta respuesta hace muchas suposiciones y es muy vaga. No veo lo que se agrega a la respuesta aceptada mucho más antigua. –

Cuestiones relacionadas