尝试从对象[0]插入nil对象?

时间:2012-08-13 12:25:16

标签: ios arrays uitableview null datasource

在我的应用程序中,我有一个UITableView和一些按钮,用户可以单击这些按钮,根据某些NSDate或int来将数组排序到订单。所以这是我尝试对UITableView进行排序的方法:

- (void)sortStats:(id)sender reloadData:(BOOL)dataBool {
    NSSortDescriptor *descriptor = nil;
    UIButton *clickedButton = (UIButton*)sender;
    if (clickedButton.tag == 1) {
            descriptor = [NSSortDescriptor sortDescriptorWithKey:@"Date" ascending:NO];
    }
    [self.cellArray sortUsingDescriptors:[NSArray arrayWithObject:descriptor]];
    [[NSUserDefaults standardUserDefaults] setObject:self.cellArray forKey:@"cellArray"];
    if (dataBool) {
        [ivstatstableView reloadData];
    }
    [ivstatstableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
}

所以最初我只使用了没有reloadData参数的方法,因为看起来UITableView上的reloadData导致了崩溃。

这是控制台崩溃日志的原因:

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'*** - [__ NSPlaceholderArray initWithObjects:count:]:尝试从对象[0]中插入nil对象

无论如何,这里有任何代码会造成这次崩溃吗?我真的想在我的应用程序中使用此功能,我知道我已经接近修复它但我不确定是什么导致了这个问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:11)

至少有一个地方可能会发生这种情况,也许还有其他地方。在获取用户默认值内容的代码中,不检查nil。所以不要这样:

[self.cellArray addObjectsFromArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"array"]];

你可能想试试这个:

NSArray *defaultCellArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"array"];
if (defaultCellArray) {
    [self.cellArray addObjectsFromArray:defaultCellArray];
}

失败的initWithObjects调用(根据您的错误消息)也可能嵌套在另一个调用中,可能是在此调用中:

[self.cellArray sortUsingDescriptors:[NSArray arrayWithObject:descriptor]];

如果查看完整的调用堆栈,它会告诉您此调用是否正在对initWithObjects进行后续调用,并且可能会将其传递给nil。在您的情况下,例如,如果nil尚未设置为值1或2,您将传入正在创建的数组clickedButton.tag。您可能还想添加其他数据帮助诊断问题的条款:

if (clickedButton.tag == 1) {
        descriptor = [NSSortDescriptor sortDescriptorWithKey:@"Date" ascending:NO];
} else if (clickedButton.tag == 2) {
        descriptor = [NSSortDescriptor sortDescriptorWithKey:@"Score" ascending:NO];
} else {
    NSLog(@"Unexpected error: Can't determine sort descriptor");
}

答案 1 :(得分:2)

这一切都非常复杂,但有一点是突出的:

[[NSUserDefaults standardUserDefaults] setObject:self.cellArray 
                                          forKey:@"cellArray"];

我认为你应该改变这一点:

NSArray *array = [NSArray arrayWithArray:self.cellArray];
[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"cellArray"];

其次,在您认为应该有对象的每个地方之后添加asserts(),即:

UIButton *theButton = ...
assert(theButton);

你还说行数是cellArray计数的两倍,猜测是故意的。