#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:
Является ли изменяемым массив, к которому вы хотите добавить словарь?