Странная ошибка при добавлении NSDictionary в NSArray

#iphone #objective-c #nsarray #nsdictionary

#iPhone #objective-c #nsarray #nsdictionary

Вопрос:

Сегодня я получил действительно странную ошибку в своем приложении:

 NSMutableDictionary *testLocal = [[NSMutableDictionary alloc] init];
[testLocal setObject:@"Test" forKey:@"title"];
[testLocal setObject:@"test notification" forKey:@"body"];
[testLocal setObject:@"1" forKey:@"repeat"];
[testLocal setObject:@"26.04.2011 - 12:53" forKey:@"start"];

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:[saver read]];
[[dict objectForKey:@"content"] addObject:testLocal]; //Crashes here! (SIGABRT)
  

Метод [saver read] возвращает это:

 {
    content =     (
                {
            body = "test notification";
            repeat = 1;
            start = "26.04.2011 - 13.06";
            title = Test;
        }
    );
}
  

Итак, я не вижу ошибки, потому что dict, в который я пишу, является изменяемым, а ключ «content» представляет собой массив.

Заранее спасибо. mavrick3.

[заставка для чтения]:

 - (NSDictionary *)read {
    return [[NSDictionary alloc] initWithContentsOfFile:[self filePath]];
}
  

Комментарии:

1. Можете ли вы опубликовать код в [saver read] ?

Ответ №1:

Попробуйте проверить, к какому классу относится объект, возвращаемый [dict objectForKey:@"content"] . Тогда вам все станет намного понятнее. Я подозреваю, что это возвращает не NSMutableArray экземпляр, а что-то другое, скорее всего NSArray , которое не отвечает на метод addObject:

Комментарии:

1. Это действительно наиболее вероятное объяснение, хотя обратите внимание, что массивы действительно реализованы CoreFoundation, поэтому отправка -class в них, как правило, бесполезна. Просмотр отчета о сбое должен в любом случае подсказать оператору, в чем проблема.

Ответ №2:

Из документации Apple для objectForKey :

Значение, связанное с aKey, или nil, если с aKey не связано ни одно значение.

Итак, ваш код может быть таким, как показано ниже

 if([dict objectForKey:@"content"] != nil amp;amp; [[dict objectForKey:@"content"] isKindOfClass:[NSMutableArray class]] )
{
  [[dict objectForKey:@"content"] addObject:testLocal];
} 
else
{
   [dict setObject: textLocal forKey: @"content"];
}
  

Комментарии:

1. Я должен сказать, что вы ошибаетесь. Совершенно нормально написать [nil AddObject:anObject]; и это не вызовет сбоя. Однако [[Массив NSArray] AddObject:anObject]; вызовет SIGABRT.

2. Этот ответ определенно неверен, и предложенный им шаблон (для которого нет необходимости проверять nil ) тоже неверен.

3. Извините, это все еще неправильно 🙂 [dict objectForKey:@»content»]; может возвращать NSArray, NSString и т.д… Предложение if будет передано как true, и тогда вы снова получите SIGABRT, если оно не вернет NSMutableArray. Вы могли бы выполнить проверку [[dict objectForKey:@»content»] isKindOfClass:[NSMutableArray class]], но не перед чтением этого developer.apple.com/library/mac/#documentation/Cocoa/Reference /… :

Ответ №3:

Является ли изменяемым массив, к которому вы хотите добавить словарь?