为什么我得到:“尝试从MutableArray中删除时,发送到不可变对象的变异方法”?

时间:2011-04-18 18:42:34

标签: objective-c cocoa cocoa-touch

我无法弄清楚为什么我在这段代码中得到'变换方法发送到不可变对象'。数组必须以某种方式不可变,但我不知道为什么。

接口:

    @interface SectionsViewController : UIViewController<UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate> {

    UITableView *table;
    UISearchBar *search;
    NSMutableDictionary *names;
    NSMutableArray *keys;

}
@property (nonatomic, retain) IBOutlet UITableView *table;
@property (nonatomic, retain) IBOutlet UISearchBar *search;
@property (nonatomic, retain) NSDictionary *allNames;
@property (nonatomic, retain) NSMutableDictionary *names;
@property (nonatomic, retain) NSMutableArray *keys;

-(void) resetSearch;
-(void) handleSearchForTerm:(NSString *)searchTerm;

@end

请注意,名称是MutableDictionary。

以下行抛出异常

[array removeObjectsInArray:toRemove];

完整上下文中的方法:

-(void)handleSearchForTerm:(NSString *)searchTerm
{
    NSMutableArray *sectionsToRemove = [[NSMutableArray alloc] init];
    for(NSString *key in self.keys)
    {
        NSMutableArray *array = [names valueForKey:key];
        NSMutableArray *toRemove = [[NSMutableArray alloc] init];

        for(NSString *name in array)
        {
            if([name rangeOfString:searchTerm
                           options:NSCaseInsensitiveSearch].location == NSNotFound)
                [toRemove addObject:name];
        }
        if([array count] == [toRemove count])
            [sectionsToRemove addObject:key];

        [array removeObjectsInArray:toRemove];
        [toRemove release];
    }
    [self.keys removeObjectsInArray:sectionsToRemove];
    [sectionsToRemove release];
    [table reloadData];
}

我从[name valueForKey:key]的结果中分配数组; 数组是'MutableArray'类型我缺少什么?

谢谢!

2 个答案:

答案 0 :(得分:9)

valueForKey:会返回NSArray。您将其发送到NSMutableArray无关紧要。

您可以将结果转换为(NSMutableArray *),但我个人的偏好是获取副本:

NSMutableArray *array = [[[names valueForKey:key] mutableCopy] autorelease];

答案 1 :(得分:3)

变量静态类型为NSMutableArray,但看起来分配给变量的对象不是NSMutableArray。变量的类型只是编译器在进行类型检查和选择方法签名时使用的提示 - 您仍需要注意确保实际分配变量应该保留的类型。