NSCFArray не выступает в качестве NSArray - PullRequest
2 голосов
/ 17 ноября 2011

Я пытаюсь сохранить данные и файл XML на Iphone.Для этого я загружаю весь XML, добавляю новые данные и сохраняю их снова.Проблема возникает, когда я пытаюсь сохранить новые данные, мои

 [mArray addObject:newData];

методы аварийно завершают работу, поскольку mArray не является NSMutableArray, вместо этого это NSCFArray, даже если я применил к нему метод mutableCopy.Как я понимаю, NSCFArray - это бесплатный мост для NSArray, поэтому я не могу понять, почему метод mublyCopy не работает.Есть идеи ??

NSMutableDictionary *wholeXML = [[NSMutableDictionary alloc] init];
wholeXML = xmlData;

NSArray *array = [[NSArray alloc] init];
NSMutableArray *mArray = [[NSMutableArray alloc] init];
array = [wholeXML objectForKey:@"Key"];
mArray = [a mutableCopy];

Ответы [ 2 ]

5 голосов
/ 17 ноября 2011

NSCFArray - это закрытый подкласс, который создается при выполнении действий с NSArray фабричными методами или инициализаторами.Вы делаете слишком много инициализаций.Попробуйте эту упрощенную версию:

NSMutableDictionary *wholeXML = [[NSMutableDictionary alloc] initWithDictionary:xmlData];
NSMutableArray *mArray = [[NSMutableArray alloc] initWithArray:[wholeXML valueForKey:@"Key"]];
2 голосов
/ 17 ноября 2011

NSCFArray - это конкретный класс для NSMutableArray и NSArray.Похоже, вы просто ошибаетесь по поводу того, какой у вас массив.Поскольку код, который вы разместили, явно не является вашим реальным кодом (он даже не скомпилируется и не обнаружит проблему, даже если бы это произошло), невозможно сказать, в какой момент ваша программа назначает неизменяемый массив переменной.Но это звучит так, как будто это происходит.

Я скажу (и, пожалуйста, не воспринимайте это как личную критику - это просто наблюдение), что код, который вы разместили, предполагает, что вы не обладаете достаточным пониманиемо том, как работают классы и идентичность объектов.Это, вероятно, основная причина здесь.

Все три ваши переменные вы инициализируете с помощью [[Something alloc] init], но затем вы сразу же выбрасываете объект и заменяете его чем-то другим.Это означает, что исходный объект (в данном случае NSMutableArray) просто просочился, а переменная теперь содержит новый объект, который вы назначили.Если этот новый объект не является NSMutableArray, он не будет волшебным образом превращен в один только потому, что переменная содержала ранее.

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