NSMutableArray addObject,无法识别的选择器
Posted
技术标签:
【中文标题】NSMutableArray addObject,无法识别的选择器【英文标题】:NSMutableArray addObject, unrecognized selector 【发布时间】:2009-11-04 21:36:14 【问题描述】:我正在尝试创建数组(城市)的数组(州)。每当我尝试将项目添加到我的 City 数组时,我都会收到此错误:
'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];
【问题讨论】:
【参考方案1】:线条:
// set up a new cities array
currentCities = [NSMutableArray init];
应阅读:
// set up a new cities array
[currentCities init];
这有望解决您的问题。你不是初始化你的数组,而是向一个类对象发送一个初始化消息,它什么都不做。之后,您的 currentCities 指针仍未初始化。
更好的是删除该行并更改第 4 行,以便您在一个步骤中分配和初始化所有内容:
NSMutableArray *currentCities = [[NSMutableArray alloc] init];
【讨论】:
如果你做单独的初始化(你不应该这样做,但如果你这样做了),它需要读取currentCities = [currentCities init]
。 NSArray 初始化器永远不会返回接收者,并且任何类的初始化器都不能保证这样做。
我拥有 [currentCities init] 的原因;行是因为当我们切换到下一个状态时它需要初始化一个新实例。更改该行确实解决了此问题,但引发了另一个问题,但是添加您提到的第二步 ([[NSMutableArray alloc] init]) 解决了该问题。谢谢。
如果你初始化一个新实例,你也应该分配一个新实例。【参考方案2】:
您需要在 NSMutableArray 上调用某种初始化程序,不是吗? initWithCapacity,或类似的东西?不知道如果不这样做会得到什么。
** 刚刚测试过。让它 [[NSMutableArray alloc] init] 你会没事的。
【讨论】:
【参考方案3】:对我来说这是初始化问题。
不得不改变
NSMutableArray *myArray = [NSMutableArray mutableCopy]; // not initialized. don't know why this even compiles
[myArray addObject:someObject]; // crashed
到
NSMutableArray *myArray = [NSMutableArray new]; // initialized!
【讨论】:
以上是关于NSMutableArray addObject,无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章
所选值未存储在 didSelectRow 的 AddObject 中
Spring MVC - HttpSession.setAttribute 和 model.addObject 之间的区别