NSMutableArray removeObjectAtIndex:抛出无效的参数异常

时间:2010-07-12 17:44:25

标签: iphone objective-c

我正在编写一个应用程序来显示门户网站的一些新闻。使用来自Internet的JSON文件获取新闻,然后使用CoreData模型将其存储到NSMutableArray中。显然,用户无法从Internet上的JSON文件中删除新闻,但他可以在本地隐藏它们。问题出现在这里,我有以下代码:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {    
if (editingStyle == UITableViewCellEditingStyleDelete) {
    if( !moc ){
        moc = [[NewsFetcher sharedInstance] managedObjectContext];
    }
    [[dataSet objectAtIndex:indexPath.row] setEliminata:[NSNumber numberWithBool:YES]];
    NSError *error;
    if( ![moc save:&error] ){
        NSLog( @"C'è stato un errore!" );
    }
    [dataSet removeObjectAtIndex:indexPath.row];
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
}   

该行:

  

[数据集   removeObjectAtIndex:indexPath.row];

导致我的应用崩溃并出现以下错误:

  

2010-07-12 19:08:16.021   ProvaVideo [284:207] * - [_ PFArray   removeObjectAtIndex:]:无法识别   选择器发送到实例0x451c820   2010-07-12 19:08:16.022   ProvaVideo [284:207] * 终止   应用程序由于未捕获的异常   'NSInvalidArgumentException',原因:   '*** - [_ PFArray removeObjectAtIndex:]:   无法识别的选择器发送到实例   0x451c820'

我试图理解为什么它不起作用但我不能。 如果我重新启动应用程序,则会正确地以逻辑方式取消新应用程序。 有什么建议??提前谢谢。


接口:

@interface ListOfVideo : UITableViewController <NSFetchedResultsControllerDelegate> { 
    NSMutableArray *dataSet;
} 
@property (nonatomic, retain) NSMutableArray *dataSet;

// In the .m file:
@synthesize dataSet;

viewDidLoad中的初始化:

dataSet = (NSMutableArray *) [[NewsFetcher sharedInstance] 
                                fetchManagedObjectsForEntity:@"News" 
                                withPredicate:predicate
                                withDescriptor:@"Titolo"]; 
[dataSet retain]; 

updateDatabase ...这是从网上检查新消息时,我将它们添加到MutableArray中:

[dataSet addObject:theNews];

3 个答案:

答案 0 :(得分:23)

你的NewsFetcher会返回一个不可变数组,而不是一个可变实例。使用以下代码进行初始化:

NSArray *results = [[NewsFetcher sharedInstance] 
                     fetchManagedObjectsForEntity:@"News" 
                     withPredicate:predicate
                     withDescriptor:@"Titolo"];
dataSet = [results mutableCopy];

A *a = (A*)b;这样的表达式只将指针强制转换为其他类型 - 它不会转换/更改它指向的实例的实际类型。

答案 1 :(得分:5)

验证dataSet是否为NSMutableArray。抛出异常是因为它没有响应removeObjectAtIndex。

答案 2 :(得分:1)

jdot是正确的dataSet必须是NSMutableArray ..

你必须这样做..

  dataSet = [NSMutableArray arrayWithArray:[[NewsFetcher sharedInstance] 
                               fetchManagedObjectsForEntity:@"News" 
                               withPredicate:predicate
                               withDescriptor:@"Titolo"]]; 

现在,dataSet是您从NewsFetcher获得的数组的可变实例,它在删除对象时不会崩溃。