Почему это странное поведение происходит с этим кодом? цель-c

У меня есть метод (приведенный ниже код является упрощенной версией), который анализирует небольшие текстовые файлы:

- (void)parseFile:(NSString *)aFile
{
   NSDate *date;
   NSNumber *number;
   NSString *desc;

   NSString *txt = [NSString stringWithContentsOfFile:aFile encoding:NSUTF8StringEncoding error:nil];
   for (NSString *line in [txt componentsSeparatedByString:@"\n"]) {
      if ([linesubstring isEqual:@"mydate"]) {
         date = [dateFormat dateFromString:strDate];
      }

      if ([linesubstring isEqual:@"mynumber"]) {
         number = [numberFormat numberFromString:strValue];
      }

      if ([linesubstring isEqual:@"mydesc"]) {
         desc = [line substringWithRange:NSMakeRange(0, 10)];
      }

      if (!date && !number && !desc) {
         ...do something...
      }
   }
}

Первая проблема заключается в том, что переменная date заполняется содержимым параметра aFile. Это только предполагает правильное значение, когда проходит через кулак if/check.

Так почему? Я подумал, что date может быть зарезервированным словом, и заменил его, но с тем же поведением.

Вторая проблема с последним if (с вложенными). Отлаживая код, я вижу, что xcode показывает его как "выходящий за рамки", но !number терпит неудачу (xcode считает, что он действителен)...

Я пробовал другие комбинации, такие как [number isNotEqualTo:[NSNull null]] (это выдает ошибку EXC_BAD_ACCESS), безуспешно.

Пожалуйста, может ли кто-нибудь дать несколько советов? Я новичок в какао/objective-c. Я пришел из Явы...

ТИА,

Боб


person Bob Rivers    schedule 13.12.2010    source источник
comment
Кажется, здесь не хватает какого-то ключевого кода. Где определяются linesubstring, strDate и strValue и что они собой представляют? Кроме того, для сравнения строк вы используете [myString isEqualToString:otherString], а не isEqual. Я вообще не понимаю, что вы на самом деле пытаетесь сделать с кодом. Вы пытаетесь установить содержимое строки текста из вашего файла в соответствующий тип переменной? Действительно ли mydate, mynumber и mydesc находятся в текстовом файле?   -  person Matthew Frederick    schedule 13.12.2010
comment
Возможно, я сильно упростил код. linesubstring является результатом substringWithRange. Я опустил его, так как эта часть кода работает правильно. strDate и strValue являются средствами форматирования. Я тоже тогда пропустил. да. Текстовые файлы, которые я пытаюсь прочитать, представляют собой файлы CSV. Я читаю строку, ищу шаблон, анализирую его и сохраняю в переменной.   -  person Bob Rivers    schedule 13.12.2010


Ответы (1)


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

Что касается ваших объявлений переменных:

NSDate *date;
NSNumber *number;
NSString *desc;

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

if (!date && !number && !desc) {
   ...do something...
}

может на самом деле всегда выполняться, потому что date, number и desc всегда могут быть ненулевыми (я говорю может, потому что на самом деле не определено, равны ли они нулю или не нулю). Инициализируйте каждый из них значением nil, если вы планируете определить, установлены они или нет:

NSDate *date = nil;
NSNumber *number = nil;
NSString *desc = nil;

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

Также есть переменная с именем linesubstring, но она нигде в коде не объявлена, аналогично strDate, strValue тоже нигде не объявлены. Важно знать, как они объявляются и как используются, поскольку они также могут указывать на мусор.

person dreamlax    schedule 13.12.2010
comment
Я не знаю, почему вы думаете, что это заслуживает только комментария. Я думаю, что отсутствие инициализации, вероятно, является основной причиной симптомов, описанных в вопросе. В любом случае, +1. - person JeremyP; 13.12.2010