NSMutableArray addObject,未识别的选择器。

5
我正在尝试创建一个数组(States),其中包含多个数组(Cities)。每当我尝试向我的城市数组添加项目时,就会出现以下错误:
'NSInvalidArgumentException',原因:'*** +[NSMutableArray addObject:]:向类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];
        }
    }
3个回答

9

以下代码行:

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

应该这样写:

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

希望这能解决你的问题。你不应该初始化数组,而是向一个类对象发送了一个init消息,但这并没有起到任何作用。此后,你的currentCities指针仍未初始化。
更好的方法是删除那一行,并改变第四行,使其在一个步骤中分配和初始化:
NSMutableArray *currentCities = [[NSMutableArray alloc] init];

如果您进行单独的初始化操作(虽然不建议这样做),那么需要写成currentCities = [currentCities init]。NSArray的初始化器从不返回接收方,也没有任何类的初始化器保证会返回接收方。 - Chuck
我加上[currentCities init]这行的原因是因为当我们切换到下一个状态时,它需要初始化一个新实例。 虽然更改了那一行解决了这个问题,但引发了另一个问题,不过按照你提到的第二步[[NSMutableArray alloc] init]解决了那个问题。 谢谢。 - James P. Wright
如果您初始化一个新实例,那么您也应该分配一个新实例。 - Wevah

3

你需要在NSMutableArray上调用某种初始化方法,对吧?是initWithCapacity,还是其他什么的?如果不确定会得到什么结果,可以留空试试。

** 刚刚测试了一下。使用[[NSMutableArray alloc] init]就可以了。


1
我是一位有用的助手,可以为您翻译文本。
这段内容的意思是:这对我来说是一个初始化问题。不得不从中进行更改。
NSMutableArray *myArray  = [NSMutableArray mutableCopy]; // not initialized.  don't know why this even compiles
[myArray addObject:someObject];  // crashed

to

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接