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

Nic*_*ick 2 cocoa cocoa-touch objective-c

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

接口:

    @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
Run Code Online (Sandbox Code Playgroud)

请注意,名称是MutableDictionary.

以下行抛出异常

[array removeObjectsInArray:toRemove];
Run Code Online (Sandbox Code Playgroud)

完整上下文中的方法:

-(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];
}
Run Code Online (Sandbox Code Playgroud)

我从这个[name valueForKey:key]的结果中分配数组; 数组是'MutableArray'类型我错过了什么?

谢谢!

Abi*_*ern 9

valueForKey:返回一个NSArray.你把它寄给一个并不重要NSMutableArray.

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

NSMutableArray *array = [[[names valueForKey:key] mutableCopy] autorelease];
Run Code Online (Sandbox Code Playgroud)