NSMutableArray从文件读入后更改字符串

Geo*_*rge 1 iphone xcode objective-c

我有一个我在程序加载时创建的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];
Run Code Online (Sandbox Code Playgroud)

如果文件存在:

pnames = [[NSMutableArray alloc] initWithContentsOfFile:myPath];
Run Code Online (Sandbox Code Playgroud)

这是比较的地方:

  NSString *strInfo;

strInfo = [pnames objectAtIndex: theInteger - 1];
NSLog(@"strInfo:  %@", strInfo);
if (strInfo == @"DOUBLE")
{
  //do something
}
Run Code Online (Sandbox Code Playgroud)

就像我说的,这个比较在第一次创建时工作正常,但不是在通过文件加载数组时.

写出文件是通过以下方式完成的:

(void)applicationWillTerminate:(UIApplication *)application {
[pnames writeToFile:[self saveFilePath] atomically:YES];

}
Run Code Online (Sandbox Code Playgroud)

当我在strInfo(从上面)查看调试器时,它显示为:

NSCFString - 0c8168 - DOUBLE ---从创建开始,并确实认为它是相同的

NSCFString - 0x3d42af0 - DOUBLE ---当它无法识别它时,通过文件加载

我们非常感谢您对此的任何见解.

地理...

bbu*_*bum 5

if (strInfo == @"DOUBLE")
{
  //do something
}
Run Code Online (Sandbox Code Playgroud)

您无法使用==来比较NSString实例-isEqualToString:.

if ([strInfo isEqualToString: @"DOUBLE"]) { ... }
Run Code Online (Sandbox Code Playgroud)

它恰好在第一次创建时工作,因为所有字符串值都作为常量字符串编译到您的应用程序中,因此,数组中的@"DOUBLE"正好与@"DOUBLE"处于同一地址比较.

从"磁盘"读取数组时,将分配新字符串.