0

我是 Objective-C 的新手,尝试向表中添加新行时遇到了很多麻烦。它的工作方式是,当应用程序加载时会弹出一个警报,询问用户是否愿意,开始新配置,加载保存的配置,或恢复上一个配置。现在,如果他们选择开始新配置,他们将被要求输入新名称,当他们点击完成时,应用程序会将新配置保存在表格中。

现在我只能让应用程序在表中存储一个配置,但是如果用户尝试进行另一个新配置,那么应用程序就会崩溃。这是我的代码的样子:

- (IBAction) testToAddToList
{
    nameOfConfig = @"Test Name"; //this just bypasses the user from having to enter a name

    NSMutableArray *array = [[NSMutableArray alloc] init];

    [array insertObject:nameOfConfig atIndex:configListDataIndex];

    self.configListData = array;

    [array release];

    configListDataIndex ++;
}

我已经阅读了很多关于这些东西的内容,但这似乎并不应该太难。另外我觉得主要问题是“数组”只有一个索引,当用户尝试添加另一个索引时,这就是导致应用程序崩溃的原因。

有人可以帮助我并告诉我我做错了什么以及如何做对吗?请!...或者也许只是指出我正确的方向?

4

2 回答 2

2

使用 NSMutableArray 的 -addObject: 方法而不是 insertObject 不是更简单吗?当您可以简单地使用 addObject:nameOfConfig 时,为什么还要使用额外的变量 (configListDataIndex):

[array addObject:nameOfConfig];
self.configListData = array;
[array release];

就是这样。

而且我想我知道它为什么会崩溃......你总是创建一个新的数组对象,并且每次你在总是新的空数组中的不同位置插入“nameOfConfig”。正因为如此,configListData 中总是只有一个对象。直接编辑 configListData 不是更好吗?

于 2009-09-18T20:57:28.560 回答
2

正如 Woofy 所提到的,问题在于您每次都在创建一个新数组,而不是获取先前创建的数组。所以,第一次添加到数组时,你基本上是在做:

[array insertObject:nameOfConfig AtIndex:0];

但是在下一次,你创建了一个全新的(空)数组,configListDataIndex 变量现在是 1,所以你调用

[array insertObject:nameOfConfig atIndex:1];

并崩溃,因为 1 超出了空数组的范围。要解决此问题,您可以执行以下操作:

NSMutableArray *array;
if (self.configListData != nil)  // I know, unnecessary, but I like being explicit with my nil checks.
    array = self.configListData;
else
    array = [NSMutableArray array];

然后不要在函数结束时释放它(因为我假设你的 configListData 的 getter 是自动释放的,或者赋值)。

这将修复崩溃程序。此外,您可以随时致电

[array addObject:nameOfConfig];

它会自动将一个对象添加到数组的末尾,因此您可以摆脱索引变量。但是您应该首先修复崩溃程序,因为更改第二部分只会隐藏错误,并使新配置替换旧配置变得更加神秘。

于 2009-09-19T17:13:31.070 回答