0

我有一个解析小文本文件的方法(下面的代码是一个简化版本):

- (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 的新手。我来自java...

TIA,

鲍勃

4

1 回答 1

3

您提供的代码有很多问题。我正在使用答案框,因为没有足够的空间来发表评论:

关于您的变量声明:

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

您已正确声明它们,但尚未初始化它们。实际上,它们可能指向任何随机垃圾。这意味着您在循环结束时的测试......

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

…实际上可能总是执行,因为datenumber并且desc可能总是非零(我说可能是因为实际上未定义它们是零还是非零)。nil如果您打算确定它们是否已设置,请将它们中的每一个初始化为:

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

并不总是需要初始化变量(例如,只要在读取之前写入它,就不需要初始化它),但是有些人提倡初始化所有变量的想法,以防止这种未定义的行为表面处理(我通常会初始化所有变量,即使我覆盖了初始化值)。

此外,还有一个变量被调用linesubstring,但它没有在代码中的任何地方声明,同样strDatestrValue也没有在任何地方声明。重要的是要知道这些是如何声明的以及如何使用它们,因为它们可能同样指向垃圾。

于 2010-12-13T04:01:36.560 回答