NSMutableArray не может быть добавлен в

У меня была такая проблема раньше, и она не получила удовлетворительного ответа.

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

Я передаю NSMutableArray *counties второму контроллеру, когда помещаю второй в стек навигации. На самом деле я установил свойство "selectedCounties" второго контроллера (также NSMutableArray) с указателем на "округи" моего первого контроллера, как вы увидите ниже.

Однако, когда я перехожу к addObject этому, я получаю следующее:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'

Вот мой код:

в SearchViewController.h:

@interface SearchViewController : UIViewController 
{
    ....
    NSMutableArray *counties;
}

....
@property (nonatomic, retain) NSMutableArray *counties;

в SearchViewController.m:

- (void)getLocationsView
{
    [keywordField resignFirstResponder];
    SearchLocationsViewController *locationsController = 
            [[SearchLocationsViewController alloc] initWithNibName:@"SearchLocationsView" bundle:nil];
    [self.navigationController pushViewController:locationsController animated:YES];
    [locationsController setSelectedCounties:self.counties];
    [locationsController release];
}

в SearchLocationsViewController.h:

@interface EventsSearchLocationsViewController : UIViewController 
    <UITableViewDelegate, UITableViewDataSource>
{
    ...
    NSMutableArray *selectedCounties;

}

...
@property (nonatomic, retain) NSMutableArray *selectedCounties;

в SearchLocationsViewController.m (дело в том, что мы переключаем каждый элемент таблицы, активный или нет в списке выбранных округов):

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if ([self.selectedCounties containsObject:[self.counties objectAtIndex:indexPath.row]]) {
        //we're deselcting!
        [self.selectedCounties removeObject:[self.counties objectAtIndex:indexPath.row]];
        cell.accessoryView = [[UIImageView alloc]
                              initWithImage:[UIImage imageNamed:@"red_check_inactive.png"]];
    }
    else {
        [self.selectedCounties addObject:[self.counties objectAtIndex:indexPath.row]];
        cell.accessoryView = [[UIImageView alloc]
                              initWithImage:[UIImage imageNamed:@"red_check_active.png"]];
    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

Мы умираем в [self.selectedCounties addObject.... там.

Теперь, когда я сам NSLog [self.selectedCounties class], он говорит мне, что это NSCFArray.

Как это произошло? Я понимаю о пакетах классов (или, во всяком случае, ДУМАЮ, что понимаю), но это явно определенный тип, и в какой-то момент он теряет подклассы таким образом, что это убивает все это. Я просто совершенно не понимаю, почему это могло произойти.


person Dan Ray    schedule 17.05.2010    source источник
comment
Как вы создаете свой объект округа?   -  person Vladimir    schedule 17.05.2010
comment
Куда вы назначили counties?   -  person kennytm    schedule 17.05.2010


Ответы (2)


Я предполагаю, что вы неправильно выделяете массив (например, NSMutableArray *arr = [[NSArray alloc] init] или присваиваете NSArray переменной NSMutableArray. Можете ли вы опубликовать код, где вы инициализируете массив?

person shosti    schedule 17.05.2010
comment
Виновен по предъявленному обвинению: self.counties = [[NSArray alloc] initWithObjects:@"Current Location", nil]; Позвольте мне это исправить и посмотреть, вдруг что-то заработает. - person Dan Ray; 17.05.2010
comment
Бинго. Проблема была в том, что во время написания кода я понял, что мне нужно быть изменчивым, и я не стал возвращаться и исправлять его везде, где это требовалось, я думаю. Я пришел из языков, в которых вещи уже изменчивы, так что это различие еще не является для меня естественным. СПАСИБО!! - person Dan Ray; 17.05.2010

Где вы инициируете объект, который вы установили как округа? Возможно, вы сделали ошибку, например:

NSMutableArray *counties = [[NSMutableArray alloc] init];

В этом случае ошибка компиляции не появится, но вы не сможете вносить изменения в массив, созданный таким образом!

person cem    schedule 17.05.2010
comment
Спасибо, @eman опередил вас на минуту или две, но это правильный ответ. - person Dan Ray; 17.05.2010