我是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 ++;
}
我一直在阅读很多有关这些内容的内容,但这似乎不应该太难。另外我觉得主要的问题是“数组”只有一个索引,当用户试图添加另一个导致应用程序崩溃的原因时。
有人可以帮帮我,告诉我我做错了什么以及我该怎么做?请!......或者只是指出我正确的方向?
答案 0 :(得分:2)
使用NSMutableArray的-addObject:方法而不是insertObject会不会更简单?为什么要使用额外的变量(configListDataIndex),当你可以简单地使用addObject:nameOfConfig:
[array addObject:nameOfConfig];
self.configListData = array;
[array release];
就是这样。
我想我知道为什么它会崩溃......你总是创建一个新的数组对象,并且每次在始终新的空数组中的不同位置插入“nameOfConfig”。因此,configListData将始终只有一个对象。编辑configListData不是更好吗?
答案 1 :(得分: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是自动释放的,或者是赋值)。
这将修复crasher。此外,您随时可以致电
[array addObject:nameOfConfig];
会自动将对象添加到数组的末尾,因此您可以删除索引变量。但是你应该首先修复crasher,因为更改第二部分只会隐藏错误,并使新配置替换旧配置更加神秘。