Быстрое перечисление с NSMutableArray, содержащим NSDictionary

Можно ли использовать быстрое перечисление с NSArray, содержащим NSDictionary?

Я просматриваю несколько руководств по Objective C, и следующий код переводит консоль в режим GDB.

NSMutableArray *myObjects = [NSMutableArray array];
NSArray *theObjects = [NSArray arrayWithObjects:@"easy as 1",@"easy as two", @"Easy as Three"];
NSArray *theKeys    = [NSArray arrayWithObjects:@"A",@"B",@"C"];    
NSDictionary *theDict = [NSDictionary dictionaryWithObjects:theObjects forKeys:theKeys];
[myObjects addObject:theDict];

for(id item in myObjects)
{
    NSLog(@"Found an Item: %@",item);
}

Если я заменю цикл быстрого перечисления на традиционный цикл подсчета

int count = [myObjects count];
for(int i=0;i<count;i++)
{
    id item;
    item = [myObjects objectAtIndex:i];
    NSLog(@"Found an Item: %@",item);
}

Приложение работает без сбоев, а словарь выводится в окно консоли.

Это ограничение быстрого перечисления или мне не хватает языка? Есть ли другие проблемы при вложении таких коллекций?

Что касается бонусных баллов, как я мог использовать GDB для отладки этого самостоятельно?


person Alan Storm    schedule 19.02.2010    source источник


Ответы (1)


Ой! arrayWithObjects: должен иметь нулевое завершение. Следующий код работает нормально:

NSMutableArray *myObjects = [NSMutableArray array];
NSArray *theObjects = [NSArray arrayWithObjects:@"easy as 1",@"easy as two", @"Easy as Three",nil];
NSArray *theKeys    = [NSArray arrayWithObjects:@"A",@"B",@"C",nil];    
NSDictionary *theDict = [NSDictionary dictionaryWithObjects:theObjects forKeys:theKeys];
[myObjects addObject:theDict];

for(id item in myObjects)
{
    NSLog(@"Found an Item: %@",item);
}

Я не уверен, почему использование традиционного цикла скрыло эту ошибку.

person andyvn22    schedule 19.02.2010
comment
Ах, одна из моих любимых Сизмов. То, что, как вы думали, работает правильно, не должно было быть. Спасибо за совет новичка! - person Alan Storm; 20.02.2010
comment
Если вы включите -Wformat («Typecheck вызывает printf / scanf» в Xcode), компилятор предупредит об этом. Если вы также включите -Werror («Обрабатывать предупреждения как ошибки» в Xcode), компилятор не сможет выполнить компиляцию из-за этой ошибки. - person Peter Hosey; 20.02.2010