NSMutableArray не может быть добавлен в - PullRequest
2 голосов
/ 17 мая 2010

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

У меня есть viewcontroller со свойством, называемым "графствами", которое является 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.

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

Ответы [ 2 ]

4 голосов
/ 17 мая 2010

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

1 голос
/ 17 мая 2010

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

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

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

...