2009-11-04 176 views
5

我想創建一個數組(城市)的數組(國家)。每當我嘗試添加一個項目到我的城市陣列,我得到這個錯誤:NSMutableArray addObject,無法識別的選擇器

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

我的代碼如下。 線它的錯誤上是

[currentCities addObject:city]; 

我敢肯定,我已經得到了一些內存管理的問題,因爲我還是不明白這一切是很好。希望有人能向我解釋我的錯誤。

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

回答

9

的線條:

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

應改爲:

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

應該有望解決您的問題。而不是初始化你的數組,你發送一個init消息給一個類對象,它什麼都不做。之後,您的currentCities指針仍未初始化。

更妙的是刪除了這一行,改變了4號線,這樣你分配和初始化都在同一個步:

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

(你不應該,但如果你這樣做),它需要讀取'currentCities = [currentCities初始化]'。 NSArray初始化器永遠不會返回接收器,並且不保證類的初始化器不會這樣做。 – Chuck 2009-11-04 21:46:59

+0

我有[currentCities init]的原因;這是因爲當我們切換到下一個狀態時它需要初始化一個新的實例。 更改該行確實解決了這個問題,但引發了另一個問題,但是添加了您提到的第二步([[NSMutableArray alloc] init])修復了該問題。 謝謝。 – 2009-11-04 22:10:20

+0

如果您初始化一個新實例,那麼您應該也正在分配一個新實例。 – Wevah 2009-11-04 22:51:04

3

你需要在NSMutableArray上調用某種初始化器,不是嗎? initWithCapacity或類似的東西?不確定你離開它會得到什麼。

**剛測試過它。使它[[NSMutableArray alloc] init],你會沒事的。

1

這是初始化的問題對我來說。

當初如果做單獨初始化從

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

改變

NSMutableArray *myArray = [NSMutableArray new]; // initialized! 
相關問題