为什么这个代码会发生这种奇怪的行为? Objective-C的

时间:2010-12-13 02:52:38

标签: objective-c cocoa xcode nsdate nsnumber

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

- (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),但没有成功。

拜托,有人可以给一些提示吗?我是cocoa / objective-c的新手。我来自java ...

TIA,

鲍勃

1 个答案:

答案 0 :(得分:3)

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

关于你的变量声明:

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

您已正确声明它们,但尚未初始化它们。就像他们一样,他们可能指向任何随机垃圾。这意味着您在循环结束时进行测试...

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

...实际上可能总是执行,因为datenumberdesc可能总是非零(我说可能因为它实际上是未定义的它们是零或非零)。如果您打算确定它们是否已设置,请将每个值初始化为nil

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

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

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