No se puede agregar un objeto a NSMutableArray

Hola chicos, tengo este código dentro de una función dentro de una clase que es una subclase de NSOperation:

//...
@implementation DataLoader

@synthesize addedAnnotations;
@synthesize addedOverlays;
@synthesize loaderFunc;
@synthesize DLDelegate;    
//...
-(id)initWithFunction:(LoaderFunc)func withDelegate:(id)delegate {
    if (self = [super init]) {
        self.addedOverlays = nil;
        self.addedAnnotations = nil;
        self.loaderFunc = func;
        self.DLDelegate = delegate;
        return self;
    }
    return nil;
}
//...
//inside a function
    for (ParkingAnnotations *annotation in fetchedObjects) {
        ParkingAnnotation *parkingAnnot = [[ParkingAnnotation alloc] init];
        workingCoordinate.latitude = [[annotation latitude] doubleValue];
        workingCoordinate.longitude = [[annotation longitude] doubleValue];
        [parkingAnnot setCoordinate:workingCoordinate];
        [parkingAnnot setTitle:[annotation valueForKey:@"lotName"]];
        [parkingAnnot setAnnotationType:[annotation iconTypeRaw]];

        [self.addedAnnotations addObject:parkingAnnot];//parkingAnnot not added to array here
        [parkingAnnot release];
    }
//...

Las anotaciones agregadas son una matriz NSMutable, he estado revisando este código con el depurador y, por alguna razón, el objeto parkingAnnot no se agrega a la matriz. Aquí está el código de encabezado relevante para la clase:

//...    
@interface DataLoader : NSOperation {
        NSMutableArray *addedAnnotations;
    NSMutableArray *addedOverlays;
    LoaderFunc loaderfunc;
    id <DataLoaderProtocol> DLDelegate;
}

@property (nonatomic, retain) NSMutableArray* addedAnnotations;
@property (nonatomic, retain) NSMutableArray* addedOverlays;
@property (nonatomic) LoaderFunc loaderFunc;
@property (assign) id DLDelegate;
//...

Es un problema asombroso porque la función en la que estoy experimentando el problema se copió de mi MapViewController y es esencialmente la misma, pero en lugar de mapView addAnnotation: En su lugar, estoy agregando a una matriz NSMutable. ¿Alguna idea de lo que pasa? ¡Gracias por adelantado!

preguntado el 10 de mayo de 11 a las 13:05

¿Puedes publicar tu código para el inicializador de ParkingAnnotation? ¿Está sucediendo algo allí que pueda hacer que sea nulo? -

Ha asignado self.addedAnnotations. Asignarlo antes del bucle For. como self.addedAnnotations = [[nsmutablearray alloc] init]; -

Al comienzo de su función init, tiene la línea: self.addedAnnotations = nil; ¿Realmente está configurando esta variable para que sea una matriz mutable en cualquier otro lugar? ¿O es nulo cuando intentas agregar más? -

Sí, ustedes tuvieron la idea correcta, no la inicialicé antes del bucle for, error tonto. Gracias por las respuestas. -

1 Respuestas

¿Dónde está realmente instanciando la matriz addedAnnotations? Solo veo que se le asigna nil en su función de inicialización, tal vez debería cambiar a algo como:

self.addedAnnotations = [[[NSMutableArray alloc] init] autorelease];

contestado el 11 de mayo de 11 a las 00:05

Maldita sea, sabía que era algo así de simple, gracias por ayudarme a verlo. ¡Eso funcionó! - Stunner

@PeyloW ¿Por qué 32? ¿Con fines de alineación de la memoria? - Iceydee

No hay ninguna razón en particular esta vez. Se requiere algún número y 32 se sintió bien. En el mundo real, desea un número que sea lo suficientemente grande como para no necesitar que se aumente la capacidad de la matriz mutable en un caso de uso normal. Dado que aumentar el tamaño de la matriz es caro. - PeyloW

Aumentar el tamaño de la matriz no es necesariamente costoso, ni cada adición de un objeto implica ningún gasto. A menos que sepa absolutamente cuántos objetos necesita, no se moleste. Dichas optimizaciones basadas en suposiciones sobre los detalles de implementación de los marcos a menudo conducen a un código que es más lento que el código que deja en manos del marco la elección de la implementación óptima. - bbum

@PeyloW: No soy una autoridad aquí, pero en mi opinión, editar la respuesta de alguien para cambiar el significado tan drásticamente es, francamente, de mala educación. De las pautas de "Cómo editar": "* aclarar el significado sin cambiarlo * siempre respeta al autor original "He revertido el cambio que hiciste en la publicación original de iceydee. - jscs

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.