【问题标题】:Why this strange behavior is occurring with this code? objective-c为什么这段代码会出现这种奇怪的行为?目标-c
【发布时间】:2010-12-13 02:52:38
【问题描述】:

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

- (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,

鲍勃

【问题讨论】:

  • 这里好像少了一些关键代码。 linesubstring、strDate 和 strValue 定义在哪里,它们是什么?此外,要比较字符串,您使用[myString isEqualToString:otherString],而不是isEqual。我根本不明白您实际上要对代码做什么。您是否尝试将文件中的一行文本的内容设置为适当的变量类型? “mydate”、“mynumber”和“mydesc”实际上在文本文件中吗?
  • 可能我把代码简化了很多。 “linesubstring”是 substringWithRange 的结果。我省略了它,因为这部分代码工作正常。 strDate 和 strValue 是格式化程序。我当时也省略了。是的。我试图阅读的文本文件是一种 CSV 文件。我读了一行,搜索一个模式,解析它,并将它存储到变量中。

标签: objective-c cocoa xcode nsdate nsnumber


【解决方案1】:

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

关于你的变量声明:

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 也没有在任何地方声明。重要的是要知道它们是如何声明的以及它们是如何使用的,因为它们可能同样指向垃圾。

【讨论】:

  • 我不知道为什么你认为这只是值得评论。我认为缺乏初始化可能是问题中描述的症状的主要原因。无论如何,+1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2020-12-27
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多