Почему я получаю: "метод мутации, отправленный неизменяемому объекту" при попытке удалить из MutableArray? - PullRequest
2 голосов
/ 18 апреля 2011

Я не могу понять, почему я получаю «метод мутации, отправляемый неизменяемому объекту» в этом фрагменте кода Массив должен быть как-то неизменным, но я не знаю почему.

Интерфейс:

    @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

Обратите внимание, что names - это 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];
}

Я присваиваю массив из результата этого [names valueForKey: key]; массив типа 'MutableArray' Что мне не хватает?

Спасибо!

Ответы [ 2 ]

9 голосов
/ 18 апреля 2011

valueForKey: возвращает NSArray.Неважно, что вы отправляете его на NSMutableArray.

. Вы можете либо преобразовать результат в (NSMutableArray *), но я предпочитаю получить копию:

NSMutableArray *array = [[[names valueForKey:key] mutableCopy] autorelease];
3 голосов
/ 18 апреля 2011

Переменная статически типизируется как NSMutableArray, но может показаться, что объект, назначенный переменной, не является NSMutableArray.Тип переменной - это просто подсказка для компилятора, которую нужно использовать при проверке типов и выборе сигнатур методов - вам все же нужно позаботиться о том, чтобы убедиться, что вы фактически присваиваете тип, который, как говорит переменная, должен храниться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...