2009-11-04 9 views
5

Estoy tratando de crear una matriz (Estados) de matrices (Ciudades). Siempre que trato de agregar un elemento a mi arsenal Ciudad consigo este error:NSMutableArray addObject, selector no reconocido

'NSInvalidArgumentException', reason: '*** +[NSMutableArray addObject:]: unrecognized selector sent to class 0x303097a0

Mi código es el siguiente. La línea de él los errores en es

[currentCities addObject:city]; 

estoy seguro de que tengo algunos problemas de gestión de memoria ya que todavía no lo entiendo del todo bien. Esperaba que alguien pudiera explicarme mi error.

if (sqlite3_prepare_v2(db, sql, -1, &statement, NULL) == SQLITE_OK){ 
     // We need to keep track of the state we are on 
     NSString *state = @"none"; 
     NSMutableArray *currentCities = [NSMutableArray alloc]; 

     // We "step" through the results - once for each row 
     while (sqlite3_step(statement) == SQLITE_ROW){ 
      // The second parameter indicates the column index into the result set. 
      int primaryKey = sqlite3_column_int(statement, 0); 
      City *city = [[City alloc] initWithPrimaryKey:primaryKey database:db]; 

      if (![state isEqualToString:city.state]) 
      { 
       // We switched states 
       state = [[NSString alloc] initWithString:city.state]; 

       // Add the old array to the states array 
       [self.states addObject:currentCities]; 

       // set up a new cities array 
       currentCities = [NSMutableArray init]; 
      } 

      [currentCities addObject:city]; 
      [city release]; 
     } 
    } 

Respuesta

9

Las líneas:

// set up a new cities array 
currentCities = [NSMutableArray init]; 

debe decir:

// set up a new cities array 
[currentCities init]; 

que esperemos que arreglar el problema. En lugar de inicializar su matriz, está enviando un mensaje de inicio a un objeto de clase, que no hace nada. Después, usted es el puntero currentCities todavía no está inicializado.

Aún mejor sería eliminar esa línea y cambiar la línea 4 de tal manera que se puede asignar e inicializar en un solo paso:

NSMutableArray *currentCities = [[NSMutableArray alloc] init]; 
+0

Si hacer la inicialización separada (que no debería, pero si lo hacen), se tiene que leer 'currentCities = [currentCities init ] '. Los inicializadores de NSArray nunca devuelven el receptor, y no se garantiza que ningún inicializador de clase lo haga. – Chuck

+0

La razón por la que tengo el [currentCities init]; línea es porque tendrá que inicializar una nueva instancia cuando pasamos al siguiente estado. Al cambiar esa línea solucionó este problema, pero surgió otro problema, sin embargo, agregar el segundo paso que mencionó ([[NSMutableArray alloc] init]) solucionó ese problema. Gracias. –

+0

Si inicializa una nueva instancia, también debería asignar una nueva instancia. – Wevah

3

Necesita llamar a un tipo de inicializador en NSMutableArray, ¿no es así? initWithCapacity, o algo así? No estoy seguro de lo que obtendrás si lo dejas.

** Acabo de probarlo. Hazlo [[NSMutableArray alloc] init] y estarás bien.

1

Era problema de inicialización para mí.

tuvieron que pasar de

NSMutableArray *myArray = [NSMutableArray mutableCopy]; // not initialized. don't know why this even compiles 
[myArray addObject:someObject]; // crashed 

a

NSMutableArray *myArray = [NSMutableArray new]; // initialized! 
Cuestiones relacionadas