2010-12-13 14 views
0

我有一种方法(下面的代码是一个简化的版本),该解析小文本文件:为什么这个奇怪的行为发生在这个代码中?目标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 /检查。

那么为什么?我虽然date可能是一个保留字并交换它,但具有相同的行为。

第二个问题是最后一个if(与嵌套的)。调试运行的代码,我可以看到,Xcode中显示为“超出范围”,但!number失败(Xcode认为它是有效的)...

我试过其他的组合,像[number isNotEqualTo:[NSNull null]](此抛出了一个错误EXC_BAD_ACCESS) , 没有成功。

请问,有人可以提供一些提示吗?我是可可/ objective-c的新手。我从Java来了...

TIA,

鲍勃

+2

似乎有一些关键代码在这里丢失。 lineubstring,strDate和strValue在哪里定义,它们是什么?另外,为了比较你使用'[myString isEqualToString:otherString]'而不是'isEqual'的字符串。我不明白你实际上想要用代码做什么。你是否试图从你的文件中将一行文本的内容设置为适当的变量类型?文本文件中实际上是“mydate”和“mynumber”以及“mydesc”吗? – 2010-12-13 03:08:07

+0

也许我简化了代码。 “linesubstring”是substringWithRange的结果。由于这部分代码工作正常,我省略了它。 strDate和strValue是格式化程序。那我也省略了。是。我正在尝试阅读的文本文件是一种CSV文件。我读了一行,搜索一个模式,解析它,并将它存储到变量中。 – 2010-12-13 15:27:15

回答

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的变量,但它并未在代码中的任何位置声明,类似地strDate,strValue也未在任何地方声明。了解这些是如何声明的以及如何使用它们是很重要的,因为它们可能类似地指向垃圾。

+0

我不知道你为什么认为这只是值得评论。我认为缺乏初始化可能是问题中描述的症状的主要原因。无论如何,+1。 – JeremyP 2010-12-13 09:28:10

相关问题