2009-11-04 18 views
5

Dizilerden oluşan bir dizi (States) oluşturmaya çalışıyorum. Benim Şehir diziye bir öğe eklemek çalıştığınızda zaman bu hatayı alıyorum şu şekildedir:NSMutableArray addObject, tanınmayan seçici

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

Benim kodudur. Ben hala iyi hepsini anlamıyorum olarak bazı Bellek Yönetimi sorun var eminim

[currentCities addObject:city]; 

olduğu üzerinde çizgi hatalarını He got. Birinin benim hatamı açıklamasını umuyordum.

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]; 
     } 
    } 

cevap

9

hatları:

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

okumak olmalı: Umarım sorunu çözmek gerekir

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

. Dizininizi başlatmak yerine, hiçbir şey yapmayan bir sınıf nesnesine bir init mesajı gönderiyorsunuz. Daha sonra, currentCities işaretçisiniz hala başlatılmamış.

Daha da iyisi tek adımda tüm bu çizgiyi kaldırmak ve tahsis şekilde 4 çizgisini değiştirip başlatmak olacaktır:

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

için

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

değiştirmek zorunda kaldı (ki yapmamalıdın, ancak bunu yaparsanız), bu 'okumak currentCities = gerekiyor [currentCities init ] '. NSArray başlatıcıları asla alıcıyı geri döndürmez ve hiçbir sınıfın başlatıcısı bunu garanti etmez. – Chuck

+0

[currentCities init] nedenim; satır, bir sonraki duruma geçtiğimizde yeni bir örneği başlatması gerekeceği içindir. Bu satırı değiştirmek bu sorunu giderdi, ancak başka bir sorunla karşılaştı, ancak bahsettiğiniz ikinci adımı eklediğinizde ([[NSMutableArray alloc] init]) bu sorunu giderdik. Teşekkür ederiz. –

+0

Yeni bir örnek başlatıyorsanız, yeni bir örnek de ayırmalısınız. – Wevah

3

Sen NSMutableArray üzerinde başlatıcısı çeşit aramaya gerek değil mi? initWithCapacity veya bunun gibi bir şey? Eğer onu bırakırsan aldığına emin değilim.

** Sadece test edilmiş. [[NSMutableArray alloc] init] yapın ve iyi olacaksınız.

1

Bu benim için başlatma sorun oldu.

ayrı başlatma yaparsanız

NSMutableArray *myArray = [NSMutableArray new]; // initialized! 
İlgili konular