Быстрое Перечисление С 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 для отладки этого сам?

5
задан Alan Storm 19 February 2010 в 23:14
поделиться

1 ответ

Я полагаю, что вы всегда могли бы разработать свою систему так, чтобы в случае, если ваша компания собирается перейти под, вы могли бы предоставить клиентам достаточно серверного программного обеспечения, конфигурационных файлов и данных, которые они могли бы разместить свою собственную версию вашего сервиса. По сути, дайте/продайте им образ вашей системы, чтобы они могли разместить (либо внутренне, либо заплатить кому-то еще) достаточно долго, чтобы перейти в новую систему. Если вы используете все серверное программное обеспечение в виртуальной машине, это может упростить (по сути) предоставление клиенту вашего сервера. Вы даже можете организовать передачу образа виртуальной машины непосредственно стороннему хостинг-провайдеру (и предоплату в течение достаточного времени для выполнения оставшейся части текущего контракта клиента), если ваша компания собирается завершить работу.

-121--3409490-

У меня не было ассемблера для восьмибитного Atari, поэтому я написал код машины напрямую. Для запуска кода из BASIC необходимо либо записать код в виде байтов десятичных данных, либо в виде последовательности. (Да, вы можете записать код в последовательность, единственный код символа из 256, который вы не можете ввести 155 - код для возврата. К счастью, нет команды машинного кода 6502 с таким значением, так что это было проблемой, только когда ветвь оказалась 101 байт назад (-101 = 155).)

Я все еще помню общий фрагмент кода, чтобы запустить таймер:

104 (pla)
169, 7 (lda #7)
162, 6 (ldx #6)
160, 10 (ldy #10)
76, 92, 228 (jmp 0xE45C)

В последние годы я посещал некоторые соревнования по оптимизации размера сборки. Несмотря на то, что большей частью кода является сборка, все еще нужно точно знать, какие команды производит ассемблер, чтобы вы знали, сколько байт они. Кроме того, иногда вы используете трюки, как если бы некоторые байты использовались как данные и как код, или если бы некоторые байты были различными командами в зависимости от того, введете ли вы первый байт или введите в середине инструкции. Затем инструкции записываются в виде байтов данных в середине кода сборки.

-121--1884476-

Oops! arrayWeyObjects: должен иметь нулевое окончание. Следующий код работает просто нормально:

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);
}

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

11
ответ дан 13 December 2019 в 19:26
поделиться