将名称添加到UIPickerView时,应用程序崩溃

时间:2013-04-29 22:13:01

标签: iphone ios objective-c xcode ipad

单击按钮时,UIAlertView会提示用户键入名称。然后将此名称创建为新的“Customer”对象并插入到可变数组中。

有一个名为'CustListByName'的独立可变数组,它存储了所有名称的列表。

我遇到的问题是,当添加第二个或第三个名称时,应用程序崩溃了。有时它会在第二次尝试时发生,有时则在第三次尝试时发生。除了(lldb)之外,调试器中没有给出任何信息。程序报告EXC_BAD_ACCESS然后它将我转储到一个包含一堆汇编代码的屏幕。

崩溃发生在以下几行代码中:

基本上,它清除名称数组,然后根据对象数组重新填充它。我已经一步一步地研究了一个断点,但一切似乎都是正确的,直到崩溃。同样令人困惑的是,为什么会在第二次或第三次尝试时发生,而不是第一次。

[custListByName removeAllObjects];
    for (Customer *object in custListByObject) {
        [custListByName addObject:object->name];
    }

以下是每次点击新客户按钮时创建并插入客户的代码:

   Customer *tempCust = [[Customer alloc] init];
    tempCust->name =[[alertView textFieldAtIndex:0] text];
    [custListByObject addObject:tempCust];
    [tempCust release];

我真的很感谢这方面的帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

我怀疑发生的事情是UIPickerView在您已经清除它之前以及在重新填充之前尝试使用来自客户阵列的信息来加载一行。这会导致错误的访问错误。

您可能会考虑做的是保留两个数组,一个用于加载客户的NSMutableArray,以及一个NSArray作为UIPickerView的实际数据源。然后在你重新加载UIPickerView之前,你说:

dataSourceArray = [loadingArray copy];
[pickView reloadAllComponents];

希望这有帮助。

编辑:

如果你的加载数组被称为loadingCustListByName,那么你的更新代码就是这样的:

[loadingCustListByName removeAllObjects];
    for (Customer *object in custListByObject) {
        [loadingCustListByName addObject:object->name];
    }
custListByName = [loadingCustListByName copy];
[pickView reloadAllComponents];

这样做可以确保UIPickerView的数据源数组始终与它认为具有的行数匹配。