我有一个我在程序加载时创建的NSMutableArray。如果程序终止,我将数组保存到文件中。然后,当应用程序再次启动时,我会检查此文件是否存在,如果存在,请将其作为数组读取。
问题是,在第一次创建时一切都很好,我检查一个数组对象对某个字符串,如果它是相等的,做一些事情。这在第一次工作正常。但是如果我从罚款中读回数组,并做同样的比较,即使他们都说它们是相同的,它也不会这么认为并且会跳过这个过程。代码示例:
如果文件不存在,则从头开始创建:
NSMutableArray *tmpArray=[[NSMutableArray alloc] initWithObjects:
@"1000",
@"1000",
@"1000",
@"500",
@"500",
@"500",
@"250",
@"250",
@"250",
@"100",
@"100",
@"100",
@"100",
@"TRIPLE",
@"TRIPLE",
@"DOUBLE",
@"DOUBLE",
@"- 500",
@"- 250",
@" - 250",
@"- 100",
@"- 100",
@"HALF",
@"BUST",
nil];
如果文件存在:
pnames = [[NSMutableArray alloc] initWithContentsOfFile:myPath];
以下是比较的来源:
NSString *strInfo;
strInfo = [pnames objectAtIndex: theInteger - 1];
NSLog(@"strInfo: %@", strInfo);
if (strInfo == @"DOUBLE")
{
//do something
}
就像我说的那样,这个比较在第一次创建时工作正常,但是当通过文件加载数组时没有。
将文件写出来是通过:
完成的(void)applicationWillTerminate:(UIApplication *)application {
[pnames writeToFile:[self saveFilePath] atomically:YES];
}
当我在strInfo(从上面)查看调试器时,它显示为:
NSCFString - 0c8168 - DOUBLE ---从创建开始,并将其识别为相等
NSCFString - 0x3d42af0 - DOUBLE ---当它无法识别它时,通过文件加载
非常感谢对此的任何见解。
...地理位置
答案 0 :(得分:5)
if (strInfo == @"DOUBLE")
{
//do something
}
您无法使用==比较NSString实例,您需要使用-isEqualToString:
。
if ([strInfo isEqualToString: @"DOUBLE"]) { ... }
它恰好在第一次创建时工作,因为所有的字符串值都作为常量字符串编译到你的应用程序中,因此,你的数组中的@“DOUBLE”恰好与@的地址相同“双倍”的比较。
从“disk”读取数组时,会分配新的字符串。
答案 1 :(得分:0)
我想知道你是否刚刚将这个NSString保存到NSUserDefaults,你会有更轻松的时间。请记住,当您将Mutable字符串保存到NSUserDefaults时,当您检索它时,它不可变。
我不确定您的确切问题,但这可能会让事情变得更容易。