gpt4 book ai didi

objective-c - 为什么这段代码会出现这种奇怪的行为? objective-c

转载 作者:行者123 更新时间:2023-12-03 17:36:33 26 4
gpt4 key购买 nike

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

- (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 (以及嵌套的 if)。调试代码,我可以看到 xcode 将其显示为“超出范围”,但是 !number 失败(xcode 认为它是有效的)...

我尝试了其他组合,例如 [number isNotEqualTo:[NSNull null]] (此组合会引发错误 EXC_BAD_ACCESS),但没有成功。

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

TIA,

鲍勃

最佳答案

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

关于变量声明:

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

关于objective-c - 为什么这段代码会出现这种奇怪的行为? objective-c ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4425458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com