2015-03-03 2 views
1

Я получаю эту ошибку при попытке добавить объект NSString с именем object в мой массив:Ошибка при добавлении объекта NSString к моему NSMutableArray

erminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x7fc48ae52ba0' 

Не знаю, почему это так. Первоначально я использовал NSArray для изменения его в NSMutableArray, но у меня все еще есть проблемы с ним. Код ниже:

-(NSMutableArray *)getReplyArrayForMessage: (NSString *)message { 
     //get the array 
     NSMutableArray *replies = [self.messageDictionary objectForKey:message]; 
     NSLog(@"%@",replies); 
     //if no replies we init the base set 
     if([replies count]==0) { 
      //get the base array 
      //this also works if a key just isn't in the dictonary 
      return replies=[self getBaseArray]; 
     } 
     else { 
      //add the other message 
      NSString *object = @"Send a different message"; 
      [replies addObject:object]; 
      return replies; 
     } 
    } 

Если кто-то может дать мне указатель, почему это происходит, я был бы признателен. Noob здесь.

+0

Как вы сделали его изменчивым? – Wain

ответ

2

Массив неизменен (NSArray), не изменен (NSMutableArray). Вы можете создать изменяемый массив из неизменного массива с помощью mutableCopy:

NSMutableArray *replies = [[self.messageDictionary objectForKey:message] mutableCopy]; 

Я знаю, что из текста исключения:

-[__NSArrayI addObject:]: unrecognized selector sent to instance ... 
    ^^^^^^^^^^ 

EDIT Я пропустил от важной информации от моего первоначального ответа ,

Использовав mutableCopy теперь есть копия массива и исходного массива (от self.messageDictionary objectForKey:message) останется неизменным после того, как вы добавите элемент. Это почти наверняка не то, что вы намеревались.

Как я уже упоминал в комментариях ниже, вы, вероятно, захотите создать пользовательский объект для хранения этих деталей (или массива пользовательских объектов), которые должны быть созданы из словаря сообщений, как только вы его получите. Усилия, необходимые для создания пользовательского объекта, в долгосрочной перспективе окупятся в десять раз.

+0

с использованием 'mutableCopy' немного более элегантно, чем мое предложение ... +1 от меня :) – nburk

+0

@nburk Touché; ваш ответ так же хорош. +1. – trojanfoe

+0

Спасибо за помощь. Я предположил, что, поскольку ответы были изменчивым массивом, который, даже если я назначил его выше, будет по-прежнему изменяться. Если я укажу любой NSMutableArray на другой массив, он всегда будет изменяться на неизменяемый, если я не использую mutableCopy? (работает сейчас кстати) – Kex

1

Вы пытаетесь добавить NSString в NSArray (который выглядит как NSMutableArray), так как вы его инициализировали как один. Это означает, что объект, который вы храните в своем messageDictionary, фактически имеет тип NSArray, а не NSMutabelArray. Таким образом, присвоение объекта объекту типа NSMutableArray фактически не изменит его тип и не изменяет его.

Это легко исправить:

NSMutableArray *replies = [[NSMutableArray alloc] initWithArray:(NSArray *) [self.messageDictionary objectForKey:message]]; 

Или вы можете пойти с mutableCopy (как это было предложено @trojanfoe), который является сокращенным, но приведет к тому же результату.

Я могу сказать, потому что сообщение об ошибке говорит -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x7fc48ae52ba0'. Обратите внимание на I в конце __NSArrayI, это означает, что этот массив фактически является неизменным, поэтому вы не можете добавлять к нему объекты.

Смежные вопросы