Почему это странное поведение происходит с этим кодом?Objective-C - PullRequest
0 голосов
/ 13 декабря 2010

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

- (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), но безуспешно.

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

TIA,

Боб

1 Ответ

3 голосов
/ 13 декабря 2010

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

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

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

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

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

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

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

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

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

...