Никакие пары ключ / значение не сохраняются в NSMutableDictionary - PullRequest
0 голосов
/ 20 февраля 2010

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

[grid setObject:v forKey:k];

K - строка в форме "xy", где x и y - однозначные целые числа, а V - номер NSN. Оба они записываются на консоль перед добавлением, так что я знаю, что это не проблема. Однако, несмотря на то, что этот код выполняется 49 раз (для сетки 7 x 7), словарь в конце пуст.

сетка определена в моем заголовочном файле с:

NSMutableDictionary *grid;

А потом я инициализировал его, когда приложение загружается (но я не знаю, нужно ли мне это делать), используя код:

grid = [[[NSMutableDictionary alloc] init] retain];

Это действительно сбивает меня с толку, потому что я только начал изучать Objective-C и пришел из гораздо более всепрощающей вселенной C # и Python.

Заранее спасибо за помощь!

1 Ответ

3 голосов
/ 20 февраля 2010

В Objective-C отправка сообщения на nil (ссылка null в мире C #) является законной и распространенной. Результат nil, и поэтому часто будет проходить тихо. Как только вы обдумаете это, это очень полезный инструмент, который делает код намного чище (без проверок на ноль и т. Д.). Итак, поставьте точку останова в строке, где вы добавляете запись в словарь. Для этого нажмите на желоб рядом со строкой в ​​Xcode. Запустите ваше приложение с включенными точками останова. Когда отладчик останавливается на этой строке, вы можете навести указатель мыши на grid. Я подозреваю, что вы увидите, что это nil (0x0). Вы также можете открыть консоль запуска и набрать po grid, чтобы напечатать описание GDB grid. Опять же, я думаю, вы обнаружите, что это ноль.

Не увидев больше кода, невозможно будет выяснить, почему grid является nil.

На боковой ноте вам не нужны дополнительные -retain, следующие за alloc/init. Прочитайте Руководство по программированию управления памятью для Какао . Это будет твой друг.

...