Objective-C:为什么我试图从nsmutablearray中删除对象时遇到异常?

时间:2014-05-14 15:25:09

标签: ios objective-c nsmutablearray

我认为我要做的事情是非常基本的东西,我有两个包含MyItem对象的NSMutableArrays。我想从一个数组中删除该项并将其添加到另一个数组但是在尝试删除它时抛出异常而是为了保存您的抱怨,我对基本OOP的理解是失败的。我甚至都没有处理枚举数组。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    MyItem *item = [self.completedItems objectAtIndex:indexPath.row]; 

    if(![self.toDoItems containsObject: item])
        [self.toDoItems addObject: item];

    if([self.completedItems containsObject: item])
        [self.completedItems removeObject:item];

    [self.tableView reloadData]; //reload contents on table view controller
}

这是例外

[__ NSArrayI removeObject:]:无法识别的选择器发送到实例0x8d8bba0

这里是如何加载数组的。它基本上是一系列词典。

@interface ToDoListTableViewController : UITableViewController
    @property (strong) NSMutableArray *completedItems;
    @property (strong) NSMutableArray *toDoItems;  
@end

self.toDoItems = [[NSMutableArray alloc] init]; //initialize array
self.completedItems = [[NSMutableArray alloc] init]; //initialize array

 MyItem *newItem = [[MyItem alloc] init];
            newItem.text = [item valueForKey:@"text"];
            newItem.completed = [[item valueForKey:@"completed"] boolValue];
            newItem.date = [item valueForKey:@"date"];

            if (newItem.completed) {
                [self.completedItems addObject: newItem];
            }
            else
            {
                [self.toDoItems addObject: newItem];
            }

EDIT 也许这段代码以某种方式使目标数组成为不可变的?

UINavigationController *navigationController = segue.destinationViewController;
CompleteTableViewController *objChild = (CompleteTableViewController *)navigationController.topViewController;

if(objChild != nil){
     objChild.completedItems =  [self.completedItems copy];
     objChild.toDoItems =  [self.toDoItems copy];
}

提前感谢您指出我的问题。

4 个答案:

答案 0 :(得分:4)

由于异常指出self.completedItemsNSArray,而不是NSMutableArrayNSArray没有这样的方法removeObject

更新!问题代码就出现了!

if(objChild != nil){
     objChild.completedItems =  [self.completedItems copy]; //should be mutableCopy
     objChild.toDoItems =  [self.toDoItems copy]; //should be mutableCopy
}

答案 1 :(得分:2)

根据代码,您将数据作为不可变对象重新分配给您的属性

if(objChild != nil){
 objChild.completedItems =  [self.completedItems copy];
 objChild.toDoItems =  [self.toDoItems copy];
}

如果你想要它是可变的,你应该使用:

if(objChild != nil){
 objChild.completedItems =  [self.completedItems mutableCopy];
 objChild.toDoItems =  [self.toDoItems mutableCopy];
}

答案 2 :(得分:1)

这就是你得到例外的原因:

if (objChild != nil) {
    // INCORRECT immutable copy, aka NSArray
    objChild.completedItems =  [self.completedItems copy]; 
    objChild.toDoItems =  [self.toDoItems copy];
}

上面的代码应如下所示:

if (objChild != nil) {
    // CORRECT mutable copy, aka NSMutableArray
    objChild.completedItems =  [self.completedItems mutableCopy];
    objChild.toDoItems =  [self.toDoItems mutableCopy];
}

因为它在运行时发生,编译器无法向您发出警告,因此您只得到崩溃。

答案 3 :(得分:0)

__ NSArrayI removeObject:]:无法识别的选择器发送到实例0x8d8bba0, 这告诉你你的数组不是可变的ArrayI(数组不可变),请仔细检查你已经加载到属性中的内容。什么都没有阻止你加载NSNumber,NSString,NSArray加载到你期望NSMutableArray类型的属性,所以你准备好了一个令人讨厌的惊喜......